При переходе на 1С:УНФ с других систем (например, CRM-систем для ритейла) часто возникает потребность адаптировать документ ЗаказПокупателя под привычный бизнес-процесс. Одной из типовых задач является добавление статуса для каждой строки товара (например, "Подтвержден", "Нет в наличии") и настройка системы так, чтобы итоговая сумма заказа и последующие документы (накладные, счета) учитывали только подтвержденные позиции.
В этой статье мы подробно разберем, как реализовать этот функционал максимально корректно, сохранив возможность легкого обновления конфигурации. Мы проанализируем различные подходы и выберем оптимальный — использование расширений.
Рассмотрим ситуацию, с которой сталкивается начинающий разработчик: стоит ли вносить правки прямо в типовую конфигурацию (снимать с поддержки) или использовать расширение? Проанализируем риски: прямое изменение типовых объектов существенно усложняет процесс обновления программы. При каждом выходе нового релиза 1С вам придется вручную объединять код, что чревато ошибками.
Расширение позволяет хранить все ваши доработки в отдельном слое. При обновлении основной конфигурации расширение просто "накладывается" сверху. Поэтому мы будем использовать именно этот механизм.
Многие разработчики сталкиваются с проблемой: реквизит в расширении добавлен, но в режиме "1С:Предприятие" колонка не отображается. Разберем по шагам, как сделать это правильно:
ЗаказПокупателя.Запасы (или Товары, в зависимости от версии УНФ).СтатусСтроки. Тип значения выберем ПеречислениеСсылка (если создадим свое перечисление в расширении) или просто Строка, если планируем использовать фиксированный список.ФормаДокумента.Запасы и вручную перетаскиваем наш новый реквизит СтатусСтроки из раздела "Объект" в элементы формы.Если после этого колонка все равно не видна, проверьте свойства реквизита в расширении. Убедитесь, что у него установлены права на просмотр и редактирование для ваших ролей.
Стандартный механизм 1С считает итог по всей колонке Всего. Нам же нужно, чтобы в подвале документа отображалась сумма только тех строк, где статус установлен в значение "Подтвержден". Проанализируем, как это реализовать.
Типовой итог в подвале формы — это часто путь к данным Объект.Запасы.ИтогСумма. Нам придется заменить это на программный расчет. Для этого создадим процедуру пересчета в модуле формы расширения:
&НаКлиенте
Процедура Расшир_ПересчитатьИтогПодтвержденных()
НовыйИтог = 0;
Для Каждого СтрокаТЧ Из Объект.Запасы Цикл
Если СтрокаТЧ.СтатусСтроки = "Подтвержден" Тогда
НовыйИтог = НовыйИтог + СтрокаТЧ.Сумма;
КонецЕсли;
КонецЦикла;
// Предположим, мы создали отдельный элемент формы для отображения этого итога
Элементы.ИтогПодтверждено.Заголовок = Формат(НовыйИтог, "ЧДЦ=2");
КонецПроцедуры
Эту процедуру необходимо вызывать в событиях ПриИзменении для колонки СтатусСтроки, а также в событиях изменения цены или количества товара, чтобы итог всегда был актуальным.
Выясним, как передать в РасходнуюНакладную или СчетНаОплату только те позиции, которые мы подтвердили в заказе. Весь механизм создания документов на основании сосредоточен в процедуре ОбработкаЗаполнения модуля объекта создаваемого документа.
Рассмотрим пример для документа РасходнаяНакладная. Нам нужно подключиться к методу ОбработкаЗаполнения через расширение с аннотацией &После или &Вместо:
&После("ОбработкаЗаполнения")
Процедура Расшир_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
// Проанализируем таблицу Запасы, которая уже заполнилась типовым механизмом
МассивСтрокНаУдаление = Новый Массив;
Для Каждого СтрокаТЧ Из ЭтотОбъект.Запасы Цикл
// Проверяем статус в исходном документе
// Обратите внимание: статус нужно искать в ТЧ исходного заказа
// через поиск соответствия строк или обращение к данным заполнения
Если СтрокаТЧ.ЗаказПокупателя.Запасы.Найти(СтрокаТЧ.НомерСтроки).СтатусСтроки <> "Подтвержден" Тогда
МассивСтрокНаУдаление.Добавить(СтрокаТЧ);
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаДляУдаления Из МассивСтрокНаУдаление Цикл
ЭтотОбъект.Запасы.Удалить(СтрокаДляУдаления);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Внимание: При работе с ОбработкаЗаполнения важно учитывать, как именно типовая конфигурация передает данные. В УНФ часто используются промежуточные структуры, поэтому иногда проще модифицировать саму структуру ДанныеЗаполнения перед тем, как отработает основной код заполнения.
Некоторые разработчики (как автор обсуждаемой темы) пытаются обойти ограничения платформы, создавая в расширении дублирующую табличную часть и синхронизируя ее с основной. Разберем, почему это плохо:
Поэтому правильный путь — расширение существующей табличной части. Современные версии платформы 8.3 позволяют это делать без каких-либо костылей.
Мы проанализировали ситуацию и выяснили, что для решения задачи лучше всего подходит создание расширения с добавлением реквизита в типовую ТЧ Запасы. Мы рассмотрели методы программного пересчета итогов на форме и способ фильтрации строк при создании документов на основании. Следуя этим рекомендациям, вы получите надежное решение, которое не "сломается" при очередном обновлении 1С:УНФ.