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