Переход с платформы 1С:Управление торговлей 10.3 на современную версию 11.5 часто вызывает трудности у разработчиков, особенно в части работы с сериями товаров — есть готовое решение для переноса документов УТ 10.3. Если в старой версии было достаточно просто присвоить значение полю Серия, то в УТ 11 логика работы с сериями стала многоуровневой и зависит от множества настроек: политики учета серий, типа склада и настроек вида номенклатуры. Разберем подробно, почему прямая запись в табличную часть Товары часто не дает результата и как правильно реализовать этот процесс программно.
В отличие от УТ 10.3, где серия была просто измерением или реквизитом строки, в УТ 11.5 механизм реализован более гибко — учесть это помогут правила переноса данных в УТ 11.5. В зависимости от выбранной Политики учета серий, данные могут храниться либо непосредственно в табличной части Товары, либо в отдельной подчиненной табличной части Серии. Рассмотрим основные сценарии:
Серия табличной части Товары.Серии, которая связывается со строкой товаров через техническое поле КлючСвязи.Если вы пытаетесь записать серию в поле ТекСтрока.Серия, а политика учета подразумевает использование отдельной таблицы, система при записи или открытии формы просто очистит ваши данные, так как они находятся «не на своем месте».
Реквизит СтатусУказанияСерий — это числовой код (битовая маска), который сообщает интерфейсу и механизмам проведения документа, насколько корректно и где именно заполнены серии. Проанализируем значения, которые принимает этот статус:
Товары, но еще не заполнена (горит красная иконка).Товары.Серии, но таблица пуста.Серии.Часто в коде можно встретить значение 14 (сумма 2+4+8). Однако установка этого статуса вручную — плохая практика, так как при изменении склада или даты документа типовые механизмы пересчитают статус заново, и ваше значение может быть сброшено в 0, если алгоритм посчитает настройки некорректными.
Рассмотрим правильный порядок действий при программном создании документа Приобретение товаров и услуг. Вместо того чтобы гадать, какой статус установить, мы будем использовать возможности типовой конфигурации.
Шаг 1: Подготовка строки в ТЧ Товары
Для каждой строки товара необходимо сгенерировать уникальный КлючСвязи. Это целое число, которое должно быть уникальным в рамках документа.
НоваяСтрока = ДокументОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("001"); // Цены предыдущих поставок
НоваяСтрока.Количество = 10;
// Генерируем ключ связи, если его еще нет
Если НоваяСтрока.КлючСвязи = 0 Тогда
МаксКлюч = 0;
Для Каждого Стр Из ДокументОбъект.Товары Цикл
МаксКлюч = Макс(МаксКлюч, Стр.КлючСвязи);
КонецЦикла;
НоваяСтрока.КлючСвязи = МаксКлюч + 1;
КонецЕсли;
Шаг 2: Заполнение серии в зависимости от политики
Выясним, куда именно нужно записывать серию. Самый надежный способ — проверить политику учета серий через метаданные или использовать универсальный подход с заполнением обеих частей (типовой механизм сам выберет нужное при записи).
// Пример заполнения для политики "Учет остатков" (ТЧ Серии)
НоваяСерия = ДокументОбъект.Серии.Добавить();
НоваяСерия.КлючСвязи = НоваяСтрока.КлючСвязи;
НоваяСерия.Серия = НайденнаяСерия;
НоваяСерия.Количество = НоваяСтрока.Количество;
// На всякий случай дублируем в ТЧ Товары (для справочного учета)
НоваяСтрока.Серия = НайденнаяСерия;
Шаг 3: Автоматический расчет статусов
Вместо ручного указания СтатусУказанияСерий = 14, воспользуемся серверным модулем. Это критически важный момент, так как процедура ЗаполнитьСтатусыУказанияСерий учитывает настройки склада (ордерный или нет) и дату документа.
// Перед записью документа вызываем типовой метод
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ДокументОбъект);
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись); // Печать акта приемки
Проанализируем ситуацию, описанную автором темы. В документе Реализация товаров и услуг серии часто указываются «по факту» отгрузки, и статусная модель может быть мягче. В Приобретении товаров и услуг серии часто связаны с планированием поступления. Если склад является ордерным, то серии в финансовом документе (Приобретении) могут быть вообще не предусмотрены политикой учета (они указываются только в Приходном ордере на товары). В этом случае, какие бы статусы вы ни ставили программно, поле будет обнуляться, так как «финансовый документ не должен знать о сериях» по настройкам системы.
Если после выполнения кода серии все равно не видны в форме документа, выполните следующие действия:
КлючСвязи в обеих табличных частях через консоль запросов. Если они не совпадают, связь не установится.НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект) непосредственно перед командой Записать(). Это гарантирует, что система применит актуальную логику версии 11.5.Использование типовых процедур — это залог того, что при обновлении конфигурации на версию 11.6 или выше ваш код продолжит работать корректно, так как логика расчета битовых масок статусов инкапсулирована внутри общих модулей 1С.