8.х Работа с табличной частью

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Dem0lisher, 19 май 2010.

  1. TopicStarter Overlay
    Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    Здравствуйте!
    В документе есть Табличная часть(Должность,Штат,Требуется,Принять)
    Я наверное делаю очень криво, но такая ситуация, реквизиты "должность" и "штат" заполняются перебором из документа Штатное Расписание, а данные для реквизита "Требуется"(число) выбираю с помощью Запроса. Как проверить условие ТЧ.Должность=Результат.Должность и добавить в следующую колонку не потревожив первых двух?
    Просто сделать все Одним запросом не осилю, хоть и понимаю, что так намного лучше, но там и так условия и внутренее соединение, а если еще и Левое внешнее делать-совсем зароюсь в этой ненормативной лексике Запросов..
  2. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    Не совсем понятно распишите задачу на примере
  3. TopicStarter Overlay
    Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    Я просто нагромоздил наверное.. Сорри. Коротко выглядит все так: Документ "Расчет потребности в персонале", табличная часть "ТЧ" в ней колонки
    -Должность
    -Штат(число работников)
    -Требуется(число работников необходимых для выполнения плана)
    -Принять(Требуется-Штат)
    Кнопка "Заполнить". "Должность" и "Штат" заполняются перебором строк Штатного расписания, а данные для третьей колонки нахожу запросом, но как добавить в ТЧ эти данные соблюдая условие по должностям?
    Может скрин или код программы осветить?
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Давайте скрин, и ваш код. Хуже не будет.
  5. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    К кончу дня хоть убей мозги отказали. Принт Скрин и код
  6. TopicStarter Overlay
    Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    Ок! Только не смейтесь над кодом, я начинающий!
    Код:
    Процедура ЗаполнитьНажатие(Элемент)
    ШТ=Документы.ШтатноеРасписание.Выбрать();
    Пока ШТ.Следующий() Цикл
    Кадры.Очистить();
    Для каждого ТекС ИЗ ШТ.Состав <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/цикл')">Цикл	</span>
    НС=Кадры.Добавить();
    НС.Должность=Текс.Должность;
    НС.ТекЧисленность=ТекС.ШтЕд;
    КонецЦикла;
    КонецЦикла;
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    |	ПланПроизводстваПлан.Номенклатура,
    |	ПланПроизводстваПлан.ЕдиницаИзмерения,
    |	ПланПроизводстваПлан.количество,
    |	НормыВыработкиНорма.Должность,
    |	НормыВыработкиНорма.Номенклатура КАК Номенклатура1,
    |	НормыВыработкиНорма.ЕдИзм,
    |	НормыВыработкиНорма.НормаВыработки
    |ИЗ
    |	Документ.ПланПроизводства.План КАК ПланПроизводстваПлан
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.НормыВыработки.Норма КАК НормыВыработкиНорма
    |		ПО ПланПроизводстваПлан.Номенклатура = НормыВыработкиНорма.Номенклатура
    |			И ПланПроизводстваПлан.ЕдиницаИзмерения = НормыВыработкиНорма.ЕдИзм";
    Результат=Запрос.Выполнить().Выбрать();
    Пока Результат.Следующий() Цикл
    К=ЭлементыФормы.Кадры.Данные;
    Если К.Должность=Результат.Должность Тогда
    К.ТребуемаяЧисленность=Результат.количество/Результат.НормаВыработки;
    Иначе К.ТребуемаяЧисленность=0;
    
    КонецЕсли;
    КонецЦикла;
    
    КонецПроцедуры
    
    
    Вот оно, надо просто добавить результаты запроса в ТЧ если должность в ТЧ и в результатах запроса одинакова а если нет-0;

    Вложения:

    • Док.png
      Док.png
      Размер файла:
      54,9 КБ
      Просмотров:
      63
  7. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Пока не въезжал, но сходу вопрос:
    Код:
    ШТ=Документы.ШтатноеРасписание.Выбрать();
    Пока ШТ.Следующий() Цикл
    Кадры.Очистить();
    Для каждого ТекС ИЗ ШТ.Состав Цикл    
    НС=Кадры.Добавить();
    НС.Должность=Текс.Должность;
    НС.ТекЧисленность=ТекС.ШтЕд;
    КонецЦикла;
    КонецЦикла;
    
    
    
    Это что за хитрая конструкция? Я предположу что в итоге у вас в ТЧ будут данные только из последнего док-та ШтатноеРасписание.

    Хотя нет, извиняюсь. Кадры - это у вас что такое?

    Хотя все-таки наверно последний док-т будет.. :)
  8. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Нужно делать заполнение "Требуется" при заполнении ТЧ. Просто запрос для "Требуется" выполнить перед заполнением ТЧ и выгрузить в табличку значений, а там уже пользоваться такой замечательной вещью, как:

    Тупо ищете в ТаблицеЗначений, где хранятся данные по "требуется", используя в качестве аргумента поиска должность...

    Но я бы посоветовал освоить соединение запросов - левое-правое-и-т-п вам не должны быть преградой - конструктор запросов всё делает за вас.

    Остальные косяки, я вижу, уже без меня у вас разбирают.
  9. TopicStarter Overlay
    Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    Ну во первых с циклом там все ок-не ругается там 2 раза цикл открывается и 2 закрывается а по поводу выборки я просто еще на заморачивался над условиями (начдата, конДата) и поэтому в скобках пока пусто
  10. TopicStarter Overlay
    Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    ТЗ=Запрос.Выполнить().Выгрузить(); ???
    И еще: У меня в результатах запроса не одна колонка-там целая куча хлама, для того, чтобы потом эту колонку вычислить делением. С этим тоже проблем не будет?
    И как вообще будет называться колонка по которой устроить поиск? Результат.Должность? Должность? Или "Должность?"
  11. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Да, я увидел. Подправил свое сообщение. А какие в итоги док-ты штатного расписания вы хотите выбирать? Критерий?

    Ну сколько полей выбираете, столько колонок и будет в таблице значений. Зачем лишнее выбирать?

    Без вас никак.. :) Это я так предполагаю УПП? У меня ее нет.
    Сейчас попробую конечно старую демку найти, установить.
  12. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Да-да, через "выгрузить" и делаете.

    Название колонки должно полностью соответствовать и быть строковым, потому, пожалуй, будет логичней "Должность" без знака вопроса.

    А по поводу хлама - да видел я ваш хлам. Конечно, можно было всё в запросе сделать, но если не можете... Метод "найти" вам находит строку, так что, можете с ней работать без проблем - с каждым элементом хлама.

    Так и у меня нет - работа у нас такая.
  13. TopicStarter Overlay
    Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    Скажите, я в правильном направлении?
    Код:
    Строка=ТЗ.Найти(НС.Должность,"Должность");
    Если Строка= Неопределено Тогда
    НС.ТребуемаяЧисленность=0;
    Иначе
    НС.ТребуемаяЧисленность=Строка.Количество/Строка.НормаВыработки;
    НС.ТекЧисленность=ТекС.ШтЕд;
    
    
    ??
  14. TopicStarter Overlay
    Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    Кажется все считает и выводит.. а как сделать, чтобы запрос искал только в определенном документе? передать через "Запрос.УстановитьПараметр()?" на форме есть ссылка на документ, но не знаю, как в самом запросе вписать условие
  15. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Делайте все одним запросом, я написать его помочь не смогу, у меня демка УПП старая, таких документов там нет (кстати озвучьте свою конфигурацию), постараюсь на словах рассказать.
    Делайте запрос, первая таблица: Документ.ШтатноеРасписание к ней левым соединением тот запрос что у вас уже есть по "НормыВыработкиНорма.Должность".
    Далее по поводу имеющегося запроса, там я думаю тоже нужно поменять на ЛЕВОЕ СОЕДИНЕНИЕ. Почему вы не устанавливаете параметры запроса - документы (те поля которые у вас есть на форме)?
    Это
    Код:
    |    НормыВыработкиНорма.НормаВыработки
    
    
    
    замените на
    Код:
    | ЕСТЬNULL(НормыВыработкиНорма.НормаВыработки, 0)
    
    
    
    а лучше переписать вычисление прям в запрос.

    Это в общем. Я не знаю как подробнее без конфигурации написать.
    Такой вопрос: вы используете документ Штатное Расписание, а разве он не делает записей по регистру? Данные в таком случае лучше брать из регистра на указанную дату.


    Делайте конструктором запрос! На вкладке "Условия" добавьте. Далее используйте "Запрос.УстановитьПараметр(,);" - посмотрите в помощнике пример.
  16. TopicStarter Overlay
    Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    Ок, давайте попробуем.. Про левое внешнее соединение я слышал, в примерах видел, но там соединение по 2-м таблицам одного запроса. А как оформить левое соединение между 2-мя запросами- что-то не соображу, в каком месте может на примере простом объясните?

    вот 2 запроса:

    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    |Тра-та-та....
    .........

    Запрос2=Новый запрос;
    Запрос2.Текст="ВЫБРАТЬ
    Тра-та-та
    .................
    В каком месте указать конструкцию ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ?
    У меня не УПП. Пустая конфигурация я ее создал для курсовика.
    И что такое | ЕСТЬNULL(НормыВыработкиНорма.НормаВыработки, 0) что-то я ее не осязаю..
  17. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Замените слово ВНУТРЕННЕЕ на ЛЕВОЕ, а принцип тот-же самый. Дальше представляете ваш этот второй запрос как одно целое. К первому запросу (тому который по документу ШтатноеРасписание) точно также присоединяете этот.
    Не так как вы написали, не будет Запрос1, Запрос2. Будет один общий запрос.

    Откройте гугл, наберите "1с соединение" например, кучу примеров можно найти. Хотя бы здесь по форму наберите в поиске, посмотрите запросы.

Поделиться этой страницей