При разработке и доработке типовых или нетиповых конфигураций 1С часто возникает задача переноса данных табличной части из документа-основания в новый документ (например, из документа отгрузки в документ возврата). Однако архитектура управляемого приложения и кастомизированные механизмы конфигураций могут усложнить поиск места, где именно выполняется перенос данных, а ручная правка запросов заполнения нередко приводит к синтаксическим ошибкам.
Разберем, где располагается логика заполнения документов, как устроен типовой механизм платформы, как локализовать нестандартные алгоритмы и как правильно скорректировать запрос выборки строк табличной части.
По умолчанию в платформе 1С:Предприятие 8 каноническим местом для описания логики создания документов на основании является событие ОбработкаЗаполнения в модуле объекта создаваемого документа. Если ввод выполняется стандартной командой платформы или методом Заполнить(), управление передается именно сюда.
Рассмотрим типовой шаблон процедуры в модуле объекта:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
// Заполнение реквизитов шапки
ДокументОснование = ДанныеЗаполнения;
// Заполнение табличной части через запрос или выгрузку
Для Каждого Стр Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Обратим внимание на работу с типами данных: метод ТабличнаяЧасть.Загрузить() доступен исключительно для серверного объекта ДокументОбъект. В контексте управляемой формы табличная часть представлена коллекцией ДанныеФормыКоллекция, поэтому прямая загрузка таблицы значений в форме без использования специальных методов (например, ЗначениеВДанныеФормы()) вызовет исключение.
Если в модуле объекта процедура ОбработкаЗаполнения пуста, а в модуле формы в процедуре ПриСозданииНаСервере нет явного обращения к табличным частям основания, значит в конфигурации реализован нестандартный ввод на основании. Выясним по шагам, как найти нужный фрагмент кода:
ДокументыСервер или менеджер документа). Проследим цепочку вызовов от клиентской процедуры к серверной функции формирования структуры данных.При доработке алгоритма выборки часто требуется добавить новое поле (например, реквизит Лоток, Серия или Склад). Если запрос содержит агрегатные функции и группировку, добавление поля только в секцию ВЫБРАТЬ приведет к ошибке выполнения: «Поле не входит в группу».
Проанализируем пример запроса, вычисляющего остаток товара к возврату с учетом нового реквизита Лоток:
ВЫБРАТЬ
ВложенныйЗапрос.Номенклатура КАК Номенклатура,
ВложенныйЗапрос.Лоток КАК Лоток,
СУММА(ВложенныйЗапрос.Количество) КАК Количество,
ВложенныйЗапрос.ТТН_ВидДокумента КАК ТТН_ВидДокумента
ПОМЕСТИТЬ ТаблицаРазница
ИЗ
(ВЫБРАТЬ
ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура,
ПеремещениеТоваровТовары.Лоток КАК Лоток,
ПеремещениеТоваровТовары.Количество КАК Количество,
ПеремещениеТоваров.ВидДокумента КАК ТТН_ВидДокумента
ИЗ
Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
ПО ПеремещениеТоваровТовары.Ссылка = ПеремещениеТоваров.Ссылка
ГДЕ
ПеремещениеТоваров.Ссылка = &ТТН
И ПеремещениеТоваров.Проведен = ИСТИНА
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПеремещениеТоваровТовары.Номенклатура,
ПеремещениеТоваровТовары.Лоток,
-ПеремещениеТоваровТовары.Количество,
ПеремещениеТоваров.ТТН.ВидДокумента
ИЗ
Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
ПО ПеремещениеТоваровТовары.Ссылка = ПеремещениеТоваров.Ссылка
ГДЕ
ПеремещениеТоваров.ТТН = &ТТН
И ПеремещениеТоваров.Проведен = ИСТИНА) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.Номенклатура,
ВложенныйЗапрос.Лоток,
ВложенныйЗапрос.ТТН_ВидДокумента
ИМЕЮЩИЕ
СУММА(ВложенныйЗапрос.Количество) > 0
;
Важное правило: все поля, указанные в секции ВЫБРАТЬ и не являющиеся агрегатными функциями (такими как СУММА, КОЛИЧЕСТВО, МАКСИМУМ), должны быть в обязательном порядке продублированы в секции СГРУППИРОВАТЬ ПО. Чтобы избежать подобных синтаксических ошибок при редактировании сложных вложенных запросов, рекомендуется использовать встроенный Конструктор запроса конфигуратора 1С.
При переносе данных табличных частей между документами следует учитывать следующие архитектурные особенности:
ОбработкаЗаполнения или процедур общих модулей лучше выполнять в расширении с помощью аннотаций &После или &Вместо, не снимая основной объект с поддержки.