При обновлении конфигурации 1С:Управление нашей фирмой (УНФ) с версии 1.6 на 1.8 (и более поздние, включая редакцию 3.0), разработчики часто сталкиваются с тем, что ранее корректно работающие обработки по загрузке данных из внешних источников перестают функционировать. Это связано с существенными изменениями в объектной модели конфигурации, переименованием или перемещением некоторых реквизитов и методов. В этой статье мы подробно разберем, как адаптировать ваш код для загрузки заказов, исправляя типичные ошибки, возникающие после такого обновления.
Основными причинами проблем, которые мы рассмотрим, являются ошибки вида "Поле объекта не обнаружено", касающиеся реквизитов ДоговорПоУмолчанию и СтавкаНДС. Давайте пошагово проанализируем каждую из них и предложим актуальные решения.
Первая и одна из наиболее частых ошибок, с которой вы можете столкнуться после обновления, связана с тем, что система не может найти поле ДоговорПоУмолчанию при попытке присвоить значение реквизиту Договор документа. Это происходит потому, что в новых версиях 1С:УНФ прямой доступ к реквизиту Контрагент.ДоговорПоУмолчанию был изменен или вовсе упразднен. Теперь для получения основного договора контрагента необходимо использовать специальные функции, реализованные в общих модулях.
Суть проблемы: В предыдущих версиях 1С:УНФ вы могли напрямую обратиться к свойству контрагента, чтобы получить его основной договор. Пример старого кода:
Если не НЗаказ.Контрагент.Пустая() Тогда
НЗаказ.Договор = Нзаказ.Контрагент.ДоговорПоУмолчанию;
// ... дальнейшая логика
КонецЕсли;
После обновления этот код перестает работать, выдавая ошибку "Поле объекта не обнаружено (ДоговорПоУмолчанию)".
Причина изменения: Переход на новую архитектуру и унификация с другими типовыми конфигурациями (например, 1С:Розница 3.0) привели к пересмотру механизмов работы с некоторыми базовыми объектами. Теперь управление основными договорами осуществляется через регистры сведений и общие функции, что обеспечивает большую гибкость и стандартизацию.
Решение: Для корректного получения основного договора контрагента в новых версиях 1С:УНФ следует использовать функцию ПолучитьДоговорПоУмолчанию из общего модуля РаботаСКонтрагентамиУНФ. Эта функция специально разработана для этих целей и учитывает всю необходимую логику выбора договора.
Давайте посмотрим, как мы можем модифицировать ваш код, чтобы он работал в обновленной конфигурации. Вам необходимо передать в эту функцию два ключевых параметра: ссылку на контрагента и ссылку на организацию, для которой ищется договор.
Если не НЗаказ.Контрагент.Пустая() Тогда
// Используем функцию общего модуля для получения основного договора
НЗаказ.Договор = РаботаСКонтрагентамиУНФ.ПолучитьДоговорПоУмолчанию(НЗаказ.Контрагент, НЗаказ.Организация);
Иначе
// Если контрагент не найден, возможно, потребуется установить валюту или другую логику
НЗаказ.ВалютаДокумента = Константы.ВалютаУчета.Получить();
КонецЕсли;
Обратите внимание, что мы передаем именно ссылки на объекты Контрагент и Организация, которые уже установлены в документе НЗаказ. Этот подход является наиболее надежным и рекомендуемым, так как он соответствует текущей логике работы конфигурации и будет поддерживаться в будущих обновлениях.
Альтернативный взгляд (для понимания, но не для использования в прямом коде):
Основной договор для контрагента хранится в регистре сведений ОсновныеДоговорыКонтрагентов. Теоретически, вы могли бы написать прямой запрос к этому регистру, чтобы получить нужный договор. Однако, мы настоятельно рекомендуем использовать готовую функцию общего модуля РаботаСКонтрагентамиУНФ.ПолучитьДоговорПоУмолчанию, поскольку она инкапсулирует в себе всю сложную логику, связанную с отбором по организации, виду договора и другим параметрам, которые могут меняться от версии к версии.
Следующая распространенная ошибка, с которой мы часто сталкиваемся после обновления, связана с реквизитом СтавкаНДС. В предыдущих версиях вы могли напрямую обратиться к реквизиту Номенклатура.СтавкаНДС для получения ставки НДС, привязанной к конкретной номенклатуре. Однако, в новых редакциях УНФ, этот реквизит был переименован.
Суть проблемы: Ваш код, который раньше работал, теперь выдает ошибку "Поле объекта не обнаружено (СтавкаНДС)" при попытке доступа к этому свойству номенклатуры:
Для каждого товар из заказ.ТЗТоваров Цикл
// ...
НС.СтавкаНДС = НС.Номенклатура.СтавкаНДС; // Здесь возникает ошибка
// ...
КонецЦикла;
Причина изменения: Переименование реквизита обусловлено стремлением к унификации и повышению ясности в наименовании полей, особенно в контексте взаимодействия с другими системами и отчетностью. Теперь поле, отвечающее за ставку НДС номенклатуры, называется ВидСтавкиНДС, что более точно отражает его смысл как ссылки на предопределенный элемент справочника или перечисления, определяющего вид ставки.
Решение: Все, что нам нужно сделать, это изменить имя реквизита, к которому мы обращаемся. Вместо СтавкаНДС следует использовать ВидСтавкиНДС.
Давайте адаптируем ваш код:
Для каждого товар из заказ.ТЗТоваров Цикл
НС = НЗаказ.Запасы.Добавить();
ЗаполнитьЗначенияСвойств(НС, Товар);
НС.Номенклатура = НайтиНоменклатуру(Товар.Номенклатура);
НС.ЕдиницаИзмерения = НС.Номенклатура.ЕдиницаИзмерения;
НС.Цена = Товар.Цена;
// Корректное обращение к ставке НДС номенклатуры в новых версиях
НС.СтавкаНДС = НС.Номенклатура.ВидСтавкиНДС;
НС.Количество = Товар.Количество;
НС.Сумма = НС.Цена * НС.Количество;
НС.ДатаОтгрузки = ПериодЗагрузки;
НС.Всего = НС.Сумма;
КонецЦикла;
После этой корректировки код должен начать корректно получать и устанавливать ставку НДС для каждой позиции номенклатуры в заказе.
Переход с одной мажорной версии 1С:УНФ (например, с 1.6 на 1.8/3.0) — это всегда значительное событие, которое может потребовать адаптации существующего кода. Мы выделим несколько ключевых рекомендаций, которые помогут вам в этом процессе:
РаботаСКонтрагентамиУНФ, РаботаСНоменклатуройУНФ и т.д.). Прежде чем писать собственную логику для получения каких-либо данных или выполнения действий, поищите соответствующую функцию в таких модулях. Использование стандартных функций повышает надежность и совместимость вашего кода с будущими обновлениями.Мы рассмотрели наиболее распространенные проблемы и способы их решения при адаптации обработки загрузки данных в 1С:УНФ после обновления. Понимая логику изменений и применяя рекомендованные подходы, вы сможете эффективно адаптировать ваш код и обеспечить бесперебойную работу системы.