При автоматизации бизнес-процессов в 1С:Бухгалтерия предприятия 3.0 программисты часто сталкиваются с ситуацией, когда документы, созданные программно, отказываются проводиться. Типичный пример — документ «Отчёт о розничных продажах». Система выдает ошибку: «Не заполнена колонка "Счет учета" в строке №...», хотя в строке указана услуга, для которой счета учета вроде бы заполняться не должны. В этой статье мы подробно разберем, почему так происходит, и как правильно настроить программное создание номенклатуры, чтобы избежать этой проблемы.
Давайте проанализируем ситуацию. Когда бухгалтер создает номенклатуру вручную в интерфейсе программы, он выбирает «Вид номенклатуры» (например, «Услуга»). В этот момент срабатывают встроенные обработчики событий формы, которые «под капотом» заполняют множество скрытых реквизитов. Однако при программном создании объекта через код (например, при загрузке из внешнего файла или через API) эти обработчики формы не запускаются.
В конфигурации 1С:Бухгалтерия 3.0 за поведение номенклатуры отвечает не только ссылка на ВидНоменклатуры, но и скрытый булев реквизит Услуга. Если этот флаг равен Ложь, система считает позицию материальным товаром. Для товаров проверка счета учета обязательна (например, счет 41.01), так как программа должна знать, с какого счета списывать остатки. Если же Услуга равна Истина, алгоритм проведения меняется, и счета учета либо подставляются по умолчанию (90-е счета), либо игнорируются в зависимости от настроек.
Рассмотрим подробнее, что происходит в коде. Программист обычно пишет что-то вроде:
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.Наименование = "Консультация специалиста";
НовыйОбъект.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Услуги");
НовыйОбъект.Записать();
В этом фрагменте мы установили ссылку на ВидНоменклатуры, но пропустили установку реквизита Услуга. В результате в базе появляется карточка номенклатуры, которая выглядит как услуга, но технически ведет себя как товар. При добавлении такой позиции в «Отчет о розничных продажах» документ требует заполнения счета учета, так как признак услуги в самом объекте номенклатуры не установлен.
Если в вашей базе уже накоплено много «неправильных» услуг, из-за которых не проводятся отчеты, не обязательно исправлять их вручную. Воспользуемся стандартной обработкой «Групповое изменение реквизитов». Пройдем по шагам:
Вид номенклатуры Равно Услуги.Услуга скрыт и не виден в обычном режиме.Услуга и установите значение в Да (Истина).После этой операции документ «Отчет о розничных продажах» начнет проводиться без требования счета учета, так как система увидит, что позиция является нематериальной.
Чтобы проблема не повторялась при следующих загрузках, нам необходимо изменить алгоритм создания номенклатуры. Вместо простой установки реквизитов вручную, рекомендуется вызывать типовые процедуры конфигурации, которые имитируют поведение формы.
Посмотрим на пример правильного заполнения объекта:
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.Наименование = "Один час работ";
НовыйОбъект.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Услуги");
// Обязательно устанавливаем флаг Услуга!
НовыйОбъект.Услуга = Истина;
// Также рекомендуется заполнить другие связанные параметры
// через типовой метод модуля менеджера (если доступен)
// или установить их вручную:
НовыйОбъект.СтатьяЗатрат = Справочники.СтатьиЗатрат.ПустаяСсылка();
НовыйОбъект.НоменклатурнаяГруппа = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Основная номенклатурная группа");
НовыйОбъект.Записать();
Проанализируем ситуацию глубже: в некоторых версиях БП 3.0 рекомендуется использовать экспортную процедуру из модуля менеджера номенклатуры для заполнения значений по умолчанию по виду номенклатуры. Это гарантирует, что все скрытые флаги (не только Услуга, но и признаки подакцизного товара, маркировки и т.д.) будут установлены верно.
Иногда счета учета не заполняются даже для корректно созданных услуг. Это происходит, когда в регистре сведений «Счета учета номенклатуры» нет соответствующей записи. Программа ищет счета по цепочке приоритетов:
При программном создании документа «Отчет о розничных продажах», после добавления строки в табличную часть, необходимо принудительно вызывать процедуру заполнения счетов. Разберем пример кода для заполнения строки документа:
НоваяСтрока = ОбъектДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = СсылкаНаУслугу;
НоваяСтрока.Количество = 1;
НоваяСтрока.Цена = 1000;
НоваяСтрока.Сумма = 1000;
// Вызываем заполнение счетов учета по правилам регистра
ПараметрыЗаполнения = Новый Структура("Номенклатура, Склад, ТипСклада",
НоваяСтрока.Номенклатура,
ОбъектДокумент.Склад,
ОбъектДокумент.Склад.ТипСклада);
// Используем типовой механизм для заполнения счетов в строке
СчетаУчетаВДокументах.ЗаполнитьСтроку(НоваяСтрока, ПараметрыЗаполнения);
Метод СчетаУчетаВДокументах.ЗаполнитьСтроку проанализирует вид номенклатуры и настройки регистра. Если это услуга и для нее в регистре прописан счет 90.01 (Выручка), он подставится в нужную колонку. Если колонка скрыта в интерфейсе, она все равно должна быть заполнена программно для успешного проведения.
Выясним причину, почему счета не видны пользователю, но мешают проведению. В 1С:Бухгалтерии есть настройка отображения счетов в документах. Чтобы увидеть, что именно не заполняется, рекомендуем временно включить эту опцию:
Перейдите в Главное — Настройки — Параметры учета — Настройки счетов учета. Установите флаг «Показывать счета учета в документах». Теперь в «Отчете о розничных продажах» появится колонка со счетами, и вы сразу увидите пустые ячейки, которые блокируют проведение.
Для стабильной работы программной загрузки в БП 3.0 придерживайтесь следующих правил:
Услуга.ОбменДанными.Загрузка = Истина только если вы уверены, что все реквизиты заполнены корректно, так как этот режим отключает типовые проверки.ЗаполнитьСчетаУчета() или аналогичные из БСП), чтобы избежать пустых значений в скрытых колонках.Следуя этим рекомендациям, вы обеспечите корректное проведение документов «Отчет о розничных продажах» и избавите пользователей от необходимости ручной правки данных после загрузки.