Как заполнить табличную часть документа при вводе на основании в 1С 8.3

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке и доработке типовых или нетиповых конфигураций 1С часто возникает задача переноса данных табличной части из документа-основания в новый документ (например, из документа отгрузки в документ возврата). Однако архитектура управляемого приложения и кастомизированные механизмы конфигураций могут усложнить поиск места, где именно выполняется перенос данных, а ручная правка запросов заполнения нередко приводит к синтаксическим ошибкам.

Разберем, где располагается логика заполнения документов, как устроен типовой механизм платформы, как локализовать нестандартные алгоритмы и как правильно скорректировать запрос выборки строк табличной части.

Стандартный механизм платформы: процедура ОбработкаЗаполнения

По умолчанию в платформе 1С:Предприятие 8 каноническим местом для описания логики создания документов на основании является событие ОбработкаЗаполнения в модуле объекта создаваемого документа. Если ввод выполняется стандартной командой платформы или методом Заполнить(), управление передается именно сюда.

Рассмотрим типовой шаблон процедуры в модуле объекта:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
        // Заполнение реквизитов шапки
        ДокументОснование = ДанныеЗаполнения;
        
        // Заполнение табличной части через запрос или выгрузку
        Для Каждого Стр Из ДанныеЗаполнения.Товары Цикл
            НоваяСтрока = Товары.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
        КонецЦикла;
    КонецЕсли;

КонецПроцедуры

Обратим внимание на работу с типами данных: метод ТабличнаяЧасть.Загрузить() доступен исключительно для серверного объекта ДокументОбъект. В контексте управляемой формы табличная часть представлена коллекцией ДанныеФормыКоллекция, поэтому прямая загрузка таблицы значений в форме без использования специальных методов (например, ЗначениеВДанныеФормы()) вызовет исключение.

Поиск логики заполнения в нетиповых механизмах

Если в модуле объекта процедура ОбработкаЗаполнения пуста, а в модуле формы в процедуре ПриСозданииНаСервере нет явного обращения к табличным частям основания, значит в конфигурации реализован нестандартный ввод на основании. Выясним по шагам, как найти нужный фрагмент кода:

  1. Анализ команды вызова: Определим, какой кнопкой создается документ. Если это отдельная кнопка на форме или в командной панели списка, перейдем в ее обработчик действия на клиенте.
  2. Поиск вызова обработок и общих модулей: Часто алгоритм вынесен во внешнюю обработку или специализированный общий модуль (например, ДокументыСервер или менеджер документа). Проследим цепочку вызовов от клиентской процедуры к серверной функции формирования структуры данных.
  3. Поиск запроса формирования строк: Для выборочного переноса строк (например, вычисления разницы между отгруженным и уже возвращенным количеством) практически всегда используется запрос к табличным частям или регистрам накопления.

Исправление ошибки группировки в запросе выборки данных

При доработке алгоритма выборки часто требуется добавить новое поле (например, реквизит Лоток, Серия или Склад). Если запрос содержит агрегатные функции и группировку, добавление поля только в секцию ВЫБРАТЬ приведет к ошибке выполнения: «Поле не входит в группу».

Проанализируем пример запроса, вычисляющего остаток товара к возврату с учетом нового реквизита Лоток:


ВЫБРАТЬ
    ВложенныйЗапрос.Номенклатура КАК Номенклатура,
    ВложенныйЗапрос.Лоток КАК Лоток,
    СУММА(ВложенныйЗапрос.Количество) КАК Количество,
    ВложенныйЗапрос.ТТН_ВидДокумента КАК ТТН_ВидДокумента
ПОМЕСТИТЬ ТаблицаРазница
ИЗ
    (ВЫБРАТЬ
        ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура,
        ПеремещениеТоваровТовары.Лоток КАК Лоток,
        ПеремещениеТоваровТовары.Количество КАК Количество,
        ПеремещениеТоваров.ВидДокумента КАК ТТН_ВидДокумента
    ИЗ
        Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
        ПО ПеремещениеТоваровТовары.Ссылка = ПеремещениеТоваров.Ссылка
    ГДЕ
        ПеремещениеТоваров.Ссылка = &ТТН
        И ПеремещениеТоваров.Проведен = ИСТИНА
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ПеремещениеТоваровТовары.Номенклатура,
        ПеремещениеТоваровТовары.Лоток,
        -ПеремещениеТоваровТовары.Количество,
        ПеремещениеТоваров.ТТН.ВидДокумента
    ИЗ
        Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
        ПО ПеремещениеТоваровТовары.Ссылка = ПеремещениеТоваров.Ссылка
    ГДЕ
        ПеремещениеТоваров.ТТН = &ТТН
        И ПеремещениеТоваров.Проведен = ИСТИНА) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.Номенклатура,
    ВложенныйЗапрос.Лоток,
    ВложенныйЗапрос.ТТН_ВидДокумента
ИМЕЮЩИЕ
    СУММА(ВложенныйЗапрос.Количество) > 0
;

Важное правило: все поля, указанные в секции ВЫБРАТЬ и не являющиеся агрегатными функциями (такими как СУММА, КОЛИЧЕСТВО, МАКСИМУМ), должны быть в обязательном порядке продублированы в секции СГРУППИРОВАТЬ ПО. Чтобы избежать подобных синтаксических ошибок при редактировании сложных вложенных запросов, рекомендуется использовать встроенный Конструктор запроса конфигуратора 1С.

Рекомендации по доработке логики заполнения

При переносе данных табличных частей между документами следует учитывать следующие архитектурные особенности:

  1. Пересчет цен и сумм: После программного добавления строк в табличную часть обязательно вызывайте типовые серверные процедуры пересчета скидок, НДС и сумм по строке, чтобы избежать расхождений в реквизитах шапки и табличной части.
  2. Использование расширений: Если конфигурация находится на поддержке, доработку процедуры ОбработкаЗаполнения или процедур общих модулей лучше выполнять в расширении с помощью аннотаций &После или &Вместо, не снимая основной объект с поддержки.
  3. Контроль остатков: При формировании корректирующих документов надежнее рассчитывать остатки к оформлению по регистрам накопления, а не прямым запросом к проведенным документам, чтобы исключить возможность повторного ввода избыточного количества позиций.
← На главную