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