При разработке расширений или автоматизации заполнения документов в конфигурации 1С:Управление нашей фирмой (УНФ) 3.0 программисты часто сталкиваются с проблемой: серийные номера в ТЧ отображаются текстом, но статус остается «красным», а движения по регистрам серий не формируются. Разберем подробно, почему так происходит и как правильно реализовать программное заполнение серийных номеров.
Для начала проанализируем, как архитектурно устроено хранение серий в документах УНФ (например, в СборкаЗапасов, ПриходнаяНакладная или РасходнаяНакладная). В отличие от многих других конфигураций, здесь используется двухкомпонентная система:
СерииНоменклатуры с типом «Строка». Это поле является чисто декоративным — в нем через точку с запятой перечисляются наименования серий для удобства пользователя, и оно же определяет цвет значка статуса серий (заполнено/не заполнено).СерииНоменклатуры. Именно на основании этой таблицы система строит движения по регистрам накопления.Запасы с набором строк в ТЧ СерииНоменклатуры.Выясним причину ошибки автора темы: он заполнял только строковое поле в основной таблице, игнорируя подчиненную ТЧ и механизм ключей связи. Рассмотрим, как исправить эту ситуацию.
Прежде чем добавлять серии, мы должны убедиться, что у строки в таблице Запасы есть уникальный КлючСвязи. Если мы создаем строку программно, его нужно сгенерировать. Если строка уже существует, его нужно прочитать.
Рассмотрим пример генерации ключа, если он не заполнен:
Если СтрокаЗапасы.КлючСвязи = 0 Тогда
// Обычно КлючСвязи — это индекс строки или максимальный ключ + 1
МаксимальныйКлюч = 0;
Для Каждого Стр Из Объект.Запасы Цикл
МаксимальныйКлюч = Макс(МаксимальныйКлюч, Стр.КлючСвязи);
КонецЦикла;
СтрокаЗапасы.КлючСвязи = МаксимальныйКлюч + 1;
КонецЕсли;
Теперь разберем по шагам процесс переноса данных из документа-основания (например, ПеремещениеЗапасов) в новый документ. Нам необходимо не просто скопировать строку, а найти ссылку на объект серии и создать запись в технической таблице.
Посмотрим на пример кода, который решает эту задачу:
// Предположим, мы находимся в процедуре обработки заполнения
// Тек — это строка из документа-источника (ПеремещениеЗапасов.Запасы)
Если ЗначениеЗаполнено(Тек.СерииНоменклатуры) Тогда
// 1. Находим соответствующую строку в новом документе (Сборка)
Отбор = Новый Структура("Номенклатура", Тек.Номенклатура);
НайденныеСтроки = Запасы.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() > 0 Тогда
СтрокаЗапасыСборка = НайденныеСтроки[0];
// 2. Устанавливаем текстовое представление (для UI)
СтрокаЗапасыСборка.СерииНоменклатуры = Тек.СерииНоменклатуры;
// 3. Разбиваем строку серий, если их несколько (через разделитель ";")
СерииМассив = СтрРазделить(Тек.СерииНоменклатуры, ";");
Для Каждого ИмяСерии Из СерииМассив Цикл
ИмяСерии = СокрЛП(ИмяСерии);
// 4. Добавляем запись в техническую ТЧ СерииНоменклатуры
НоваяСтрокаСерии = СерииНоменклатуры.Добавить();
НоваяСтрокаСерии.КлючСвязи = СтрокаЗапасыСборка.КлючСвязи;
НоваяСтрокаСерии.Количество = 1; // Для серийных номеров всегда 1
// Важно: Поиск серии по наименованию должен учитывать владельца (Номенклатуру)
СерияСсылка = Справочники.СерииНоменклатуры.НайтиПоНаименованию(ИмяСерии, Истина, , СтрокаЗапасыСборка.Номенклатура);
Если Не СерияСсылка.Пустая() Тогда
НоваяСтрокаСерии.Серия = СерияСсылка;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Проанализируем ситуацию: даже если данные в таблицах есть, иконка серии может оставаться серой или красной до момента пересчета на форме. В типовых конфигурациях УНФ за это отвечают специальные процедуры в общих модулях.
Для корректной работы рекомендуется использовать методы модуля СерииНоменклатурыСервер (название может незначительно меняться в зависимости от версии 3.0.x). После программного изменения ТЧ на сервере, если вы работаете в контексте формы, желательно вызвать:
СерииНоменклатурыКлиентСервер.ОбновитьИндикаторыСерий(ЭтаФорма);
Поиск по наименованию: Как было отмечено в обсуждении, использование НайтиПоНаименованию без указания владельца — это плохая практика. У разных товаров могут быть одинаковые серийные номера. Всегда передавайте в поиск владельца (Номенклатура или КатегорияНоменклатуры в зависимости от настроек политики).
Политика учета серий: Перед заполнением убедитесь, что для данной номенклатуры вообще включен учет серий. Проверить это можно через функцию:
СерииНоменклатурыСервер.ИспользоватьСерииНоменклатуры(СтрокаЗапасов.Номенклатура)
Ключ связи и его уникальность: В УНФ 3.0 КлючСвязи должен быть уникальным в рамках всего документа. Если вы копируете строки из разных документов, следите, чтобы ключи не пересекались, иначе серии от одной строки «приклеятся» к другой.
Использование API УНФ: Вместо прямого перебора ТЧ, в современных версиях УНФ рекомендуется использовать структуру, которую возвращает метод СерииНоменклатурыСервер.ПолучитьСтруктуруСерийДокумента(ЭтотОбъект). Это позволяет работать с сериями более абстрактно и надежно.
Мы рассмотрели механизм программного управления сериями. Основной секрет успеха заключается в синхронизации двух табличных частей через КлючСвязи. Помните, что поле СерииНоменклатуры в основной таблице — это всего лишь текстовая маска, а реальная работа происходит в подчиненной таблице, данные из которой попадают в регистры при проведении документа.