При переходе на новые релизы конфигурации «1С:Управление торговлей» редакции 11.4 (начиная с ветки 11.4.6 и выше) многие пользователи и разработчики столкнулись с неожиданным изменением поведения системы. Автоматические скидки, которые ранее без проблем рассчитывались «на лету» непосредственно в момент проведения документов (например, в релизе 11.4.2.132), перестали вычисляться автоматически. Вместо этого система требует от пользователя ручного нажатия кнопки или выдает ошибку при попытке программного проведения.
В рамках этой статьи мы подробно разберем, почему произошли эти изменения, проанализируем техническую сторону вопроса, рассмотрим зарегистрированную ошибку в багтрекинге фирмы 1С и найдем практические варианты решения этой проблемы как для обычных пользователей, так и для программистов, занимающихся автоматизацией и интеграцией.
Для того чтобы понять суть проблемы, проанализируем архитектурные изменения, которые внедрили разработчики фирмы 1С. В старых релизах конфигурации процесс расчета автоматических скидок происходил внутри транзакции проведения документа. Это казалось удобным, так как гарантировало актуальность цен и скидок на момент записи данных в регистры.
Однако у такой схемы был огромный минус — производительность. Расчет скидок (особенно при наличии сложных цепочек условий, вытеснения, совместного действия и больших объемов номенклатуры в документе) является крайне ресурсоемкой операцией. Выполнение этих вычислений внутри транзакции проведения приводило к следующим негативным последствиям:
Для решения этих проблем разработчики 1С приняли решение вынести расчет автоматических скидок из процедуры проведения. Теперь система требует, чтобы скидки были рассчитаны до начала транзакции проведения, непосредственно в интерактивной форме документа.
Несмотря на то, что архитектурно это решение было правильным и существенно снизило количество блокировок базы данных, его первоначальная реализация вызвала массу сбоев в реальной работе предприятий. Данная проблема официально зарегистрирована в багтрекинге фирмы 1С под номером 000049594.
Суть ошибки заключается в том, что при попытке программного проведения документа (без открытия формы) система блокировала запись, выдавая предупреждение о том, что автоматические скидки не рассчитаны. Это полностью парализовало работу следующих механизмов:
Давайте рассмотрим, как решать эту проблему в зависимости от вашей роли: обычного пользователя или разработчика 1С.
Если вы работаете в программе через стандартный интерфейс и столкнулись с тем, что скидки не считаются сами при нажатии кнопки «Провести», вам необходимо скорректировать привычный порядок действий. Разберем по шагам, как правильно проводить документы со скидками:
В некоторых релизах системы при попытке проведения недосчитанного документа может появляться интерактивное диалоговое окно с вопросом: «В документе не рассчитаны автоматические скидки. Рассчитать и продолжить проведение?». В таком случае пользователю достаточно нажать кнопку «Да» для завершения операции.
Если вы столкнулись с ошибкой проведения при написании собственных обработок, интеграций или обменов данными, вам необходимо программно инициировать расчет автоматических скидок перед вызовом метода Записать. Рассмотрим подробнее, как это сделать правильно.
Для программного расчета скидок в конфигурациях на базе ERP и УТ 11 используется специальный общий модуль СкидкиНаценкиСервер. Ниже приведен пример кода, который необходимо вставить в вашу обработку загрузки или создания документов перед их проведением:
// Создаем или получаем объект документа (например, Заказ клиента)
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Проверяем, что документ заполнен и готов к расчету скидок
Если ДокументОбъект.Товары.Количество() > 0 Тогда
// Вызываем типовой метод расчета автоматических скидок
ПараметрыРасчета = СкидкиНаценкиСервер.ПараметрыРасчетаСкидокНаценок();
СкидкиНаценкиСервер.РассчитатьСкидкиНаценки(ДокументОбъект, ПараметрыРасчета);
// Записываем документ с режимом проведения
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ЗаписьЖурналаРегистрации("ПрограммныйРасчетСкидок", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
В этом примере функция СкидкиНаценкиСервер.ПараметрыРасчетаСкидокНаценок() подготавливает структуру необходимых параметров, а процедура СкидкиНаценкиСервер.РассчитатьСкидкиНаценки() непосредственно модифицирует объект документа, рассчитывая скидки по всем действующим в системе правилам и заполняя соответствующие реквизиты табличной части.
Рассмотрим еще одну ситуацию. Что делать, если вам нужно срочно провести документы программно (например, при переносе остатков или обновлении исторических данных), но рассчитывать скидки заново не нужно (или они уже были жестко зафиксированы ранее)? В таком случае можно использовать специальный механизм обхода проверки через дополнительные свойства объекта.
При проведении документа система проверяет флаг готовности скидок. Мы можем принудительно передать в параметры проведения информацию о том, что скидки уже считаются рассчитанными. Для этого используется добавление специального ключа в коллекцию ДополнительныеСвойства объекта документа:
// Получаем объект документа для изменения
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Передаем свойство, отключающее проверку расчета скидок
ДокументОбъект.ДополнительныеСвойства.Вставить("СкидкиРассчитаны", Истина);
// Проводим документ без вызова тяжелых процедур расчета
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить("Не удалось провести документ: " + ОписаниеОшибки());
КонецПопытки;
Важное предупреждение: Использование свойства "СкидкиРассчитаны" со значением Истина не производит физический пересчет скидок. Оно лишь сообщает платформе, что проверка пройдена, предотвращая генерацию ошибки проведения. Используйте этот метод аккуратно и только тогда, когда вы уверены в корректности уже заполненных сумм в табличной части.
Для того чтобы минимизировать возникновение подобных ошибок в будущем, мы рекомендуем выполнить следующие действия по администрированию вашей информационной базы:
Мы подробно проанализировали особенности работы с автоматическими скидками в конфигурации «1С:Управление торговлей» редакции 11.4. Теперь вы знаете, какими причинами руководствовались разработчики при изменении архитектуры программы, как правильно выполнять расчет в ручном режиме и как обойти ограничения при программном проведении документов в ваших интеграционных решениях.