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