1с перед записью на сервере изменить реквизит

 +3 

   

Распечатать

1С 8.3 : Событие ПередЗаписью регистра сведений. Как перед записью изменить значение реквизита записи?

Событие ПередЗаписью возникает перед выполнением записи набора регистра сведений. Процедура-обработчик вызывается после начала транзакции записи, но до начала записи набора регистра сведений.

Пример проверки на условие и заполнение реквизита Цвет:

Код 1C v 8.х

 Процедура ПередЗаписью(Отказ, Замещение)
Для Каждого ТекЗапись Из ЭтотОбъект Цикл
Если ТекЗапись.СерияНоменклатуры.Восстановленный Тогда 
ТекЗапись.Цвет="2551650";
Иначе
ТекЗапись.Цвет="";
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Ниже приведен пример процедуры ПередЗаписью для регистра сведений «Курсы», который содержит курсы валют по периодам. При попытке ввести или изменить курс валюты период которого раньше даты регистрации фирмы будет выведено два сообщения:

Код 1C v 8.2 УП

 Процедура ПередЗаписью (Отказ, Замещение)
            ДатаРегистрации = Константы.ДатаРегистрации.Получить ();
            Для Каждого ТекЗапись Из ЭтотОбъект Цикл

                                      Если ТекЗапись.Период < ДатаРегистрации Тогда
// Если период раньше даты регистрации
            Отказ = Истина; // отказ от записи
                        Сообщить(" Запись от " + ТекЗапись.Период +
                                               " с курсом " + ТекЗапись.Курс +
                                               " раньше даты регистрации фирмы!");
                        КонецЕсли;
            КонецЦикла;

                  Если Отказ Тогда
            Сообщить ("Запись не выполнена!");
            КонецЕсли;
КонецПроцедуры

Попал в какую-то непонятную ситуацию, говорящую о том, что не хватает каких-то, похоже элементарных, базовых знаний.
Итак простейшая задача, при записи/перезаписи/проведении документа установить значение реквизита объекта.
Весь код приводить нет смысла, вот упрощенный фрагмент

1C
1
2
3
4
5
6
7
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
............................................................................................................
Если Условие Тогда
ТекущийОбъект.Комментарий = ТекущийОбъект.Контрагент.РегНомер; // значение "123"
ЭтотОбъект.Объект.Комментарий = ТекущийОбъект.Контрагент.РегНомер; ;
КонецЕсли;

И вот ничерта не пойму. Почему

1C
1
ТекущийОбъект.Комментарий = ТекущийОбъект.Контрагент.РегНомер;

устанавливает нужное значение Комментарий текущего объекта = «123», а комментарий ЭтотОбъект.Объект.Комментарий остается прежним, не меняется.
И так же, оставляю в коде только

1C
1
ЭтотОбъект.Объект.Комментарий = ТекущийОбъект.Контрагент.РегНомер;

так же устанавливает нужное значение «123» у Объект.Комментарий, но не меняет его у Текущего объекта.
Получается ТекущийОбъект и ЭтотОбъект.Объект это не одно и тоже????? В голове не укладывается, но каждая строка установленная в коде по одной в итоге НИЧЕГО не меняет, Комментарий в документе остается прежним как до записи и лишь сочетание двух строк, как в приведенном коде, дает результат, Комментарий записывается так как надо (устанавливает значение «123»).
Помогите разобраться как-то шарики за ролики уже убежали, никак не пойму

Добавлено через 7 минут
Перечитал, уточняю, чтобы не было кривотолков. Прекрасно понимаю, что ТекущийОбъект — это ДокументОбъект, а ЭтотОбъект.Объект — ДанныеФормыСтруктура. Но почему, чтобы вывести новое значение недостаточно установить его только в одном месте?

&НаСервере
Процедура Изменение_значения_реквизита_объекта(ДокСсылка, Новое_значение_реквизита)// Процедура программно меняет значение реквизита объекта (документа)
    // ДокСсылка — документ в котором необходимо изменить реквизит
    // Новое_значение_реквизита — новое значение реквизита «Реквизит_для_корректировки»

    // или так: ДокументССылка=Документы.ТТН.НайтиПоНомеру(СокрЛП(Ном),Дата(‘2021-05-16’));

Если  Не ДокСсылка.Пустая() ТогдаДокОбъект=ДокСсылка.ПолучитьОбъект();
       
ДокОбъект.Реквизит_для_корректировки = Новое_значение_реквизита;
       
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);

        Попытка

ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
        Исключение
           
Сообщить(ОписаниеОшибки());
        КонецПопытки

    Иначе

Сообщить(Новое_значение_реквизита+» не записано в «+ДокСсылка+«! Документ не определен»);
    КонецЕсли

КонецПроцедуры

Последовательность событий при записи нового документа из формы документа

Заливкой выделены события, выполняющиеся в транзакции записи.

Последовательность событий при проведении документа из формы документа (провести и закрыть)

Заливкой выделены события, выполняющиеся в транзакции записи.

Последовательность событий при отмене проведения документа из формы документа

Заливкой выделены события, выполняющиеся в транзакции записи.

Обработчики событий

ПередЗаписью(Отказ, ПараметрыЗаписи)  // модуль формы клиент

Расширение управляемой формы для документа. Возникает на клиенте перед выполнением записи объекта из формы. Процедура-обработчик данного события вызывается перед вызовом процедуры-обработчика события ПередЗаписью.

  • Отказ, тип Булево. Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина, запись выполнена не будет и будет вызвано исключение. Значение по умолчанию: Ложь.
  • ПараметрыЗаписи, тип Структура. Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения. Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения». Параметр РежимПроведения может отсутствовать, если режим проведения в документе не определен.

Примечание: В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.

ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)  // модуль формы сервер

Расширение управляемой формы для документа. Вызывается перед записью объекта на сервере. Можно отменить запись. Выполняется вне транзакции.

  • Отказ, тип Булево. Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина, запись выполнена не будет и будет вызвано исключение. Значение по умолчанию: Ложь.
  • ТекущийОбъект, тип ДокументОбъект.ИмяДокумента. Записываемый объект.
  • ПараметрыЗаписи, тип Структура. Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения. Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения».
ДокументОбъект.ИмяДокумента.ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)  // модуль объекта сервер

Возникает перед выполнением записи объекта. Процедура-обработчик вызывается после начала транзакции записи, но до начала записи документа.

  • Отказ, тип Булево. Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина, то запись выполнена не будет и будет вызвано исключение. Значение по умолчанию: Ложь.
  • РежимЗаписи, тип РежимЗаписиДокумента. В параметр передается текущий режим записи документа. Позволяет определить в теле процедуры режим записи. Изменение значения параметра позволяет изменить режим записи.
  • РежимПроведения, тип РежимПроведенияДокумента. В данный параметр передается текущий режим проведения. Изменение значения параметра позволяет изменить режим проведения.
ДокументОбъект.ИмяДокумента.ПриЗаписи(Отказ)  // модуль объекта сервер

Возникает при записи объекта. Процедура-обработчик вызывается после записи объекта в базу данных, но до окончания транзакции записи.

  • Отказ, тип Булево. Признак отказа от записи документа. Если в теле процедуры-обработчика установить данному параметру значение Истина, то запись документа выполнена не будет. Значение по умолчанию: Ложь.
ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)  // модуль формы сервер

Расширение управляемой формы для документа. Возникает на сервере при записи объекта из формы. Процедура-обработчик вызывается после записи объекта (после события ПриЗаписи объекта) в базу данных, но до окончания транзакции записи.

  • Отказ, тип Булево. Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина, то запись произведена не будет. Значение по умолчанию: Ложь.
  • ТекущийОбъект, тип ДокументОбъект.ИмяДокумента. Записываемый документ.
  • ПараметрыЗаписи, тип Структура. Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения. Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения».
ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)  // модуль формы сервер

Расширение управляемой формы для документа. Вызывается после записи объекта на сервере и после завершения транзакции.

  • ТекущийОбъект, тип ДокументОбъект.ИмяДокумента. Записываемый объект.
  • ПараметрыЗаписи, тип Структура. Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения. Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения».
ПослеЗаписи(ПараметрыЗаписи)  // модуль формы клиент

Расширение управляемой формы для документа. Возникает на сервере после записи объекта и после окончания транзакции записи, то есть к моменту вызова этой процедуры запись объекта полностью завершена.

  • ПараметрыЗаписи, тип Структура. Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения. Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения».

Примечание: В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.

Поиск:
1С:Предприятие • Документ • Перед записью • Перед записью на сервере • После записи • После записи на сервере • При записи • При записи на сервере • Событие

На чтение 6 мин. Просмотров 2.6k. Опубликовано 15.12.2019

Содержание

  1. Как изменить значение реквизита документа 1С?
  2. Изменение команд формы
  3. Изменение реквизитов формы
  4. Изменение элементов формы
  5. Документы
  6. Документы в языке 1С 8.3, 8.2 (в примерах)

Как изменить значение реквизита документа 1С?

Как изменить значение реквизита документа 1С?
Часто возникает потребность изменить какое-то значение в отдельном реквизите. И не в одном документе, в в нескольких документах. Возможно использовать запрос.
Например:

В статье был рассмотрен вопрос:
Как изменить значение реквизита документа 1С?

Платформа 1С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.

Программная модификация формы может потребоваться в нескольких случаях:

  • При доработке типовых конфигураций для облегчения процедуры последующего обновления. В этом случае будет изменен только модуль формы. Модули намного проще обновлять, чем форму.
  • При реализации некоторых общих алгоритмов. Например, в подсистеме БСП «Запрет редактирования реквизитов объектов» для всех подключенных к подсистеме объектов предусмотрено программное создание кнопки для включения возможности редактирования реквизитов.
  • При реализации некоторых специфических алгоритмов. Например, в справочнике Номенклатура создаются поля для редактирования дополнительных реквизитов.

В управляемой форме можно программно добавить, изменить и удалить:

Все указанные операции возможны только на сервере.

Программное изменение формы имеет ограничения:

  • Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
  • Нельзя назначить реквизит основным.

Изменение команд формы

Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды . У коллекции есть несколько методов:

Коллекция Команды доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Добавить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере.

В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию () . Создание выполняется при открытии формы.

&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
Команда = Команды . Добавить ( «ИсторияИзменений» );
Команда . Действие = «Подключаемый_ОтобразитьИсторию» ;
Команда . Заголовок = «История изменений…» ;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию ( Команда )
// действия команды
КонецПроцедуры

Обработчик команды должен располагаться в форме и иметь директиву компиляции &НаКлиенте .

Изменение реквизитов формы

Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты ( Путь >) , возвращающей массив типа РеквизитФормы . Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.

Изменение реквизитов выполняется методом ИзменитьРеквизиты ( ДобавляемыеРеквизиты >, УдаляемыеРеквизиты >) объекта УправляемаяФорма . В параметры ДобавляемыеРеквизиты и УдаляемыеРеквизиты передаются массивы с элементами типа РеквизитФормы .

Внимание!

Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.

Создадим новый реквизит формы с именем Покупатель:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив ;
ДобавляемыеРеквизиты . Добавить(Новый РеквизитФормы («Покупатель», Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));

// Изменения состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );

Изменение элементов формы

Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы . У коллекции есть несколько методов:

Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить () , Добавить () , Переместить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:

Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие ( ИмяСобытия >, Действие >) .

Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.

Добавление команды и связанной с ней кнопки:

// Создание команды
Команда = Команды . Добавить ( «ИсторияИзменений» );
Команда . Действие = «Подключаемый_ОтобразитьИсторию» ; // В форме должна быть процедура с указанным наименованием
Команда . Заголовок = «История изменений…» ;
// Создание кнопки и связь ее с командой
Элемент = Элементы . Добавить ( «ИсторияИзменений» , Тип ( «КнопкаФормы» ));
Элемент.ИмяКоманды = «ИсторияИзменений» ;

Добавление реквизита и связанного с ним поля ввода:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты . Добавить (Новый РеквизитФормы ( «Покупатель» , Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));
// Изменение состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );
// Создание поля ввода и связь с реквизитом
Элемент = Элементы . Добавить ( «Покупатель» , Тип ( «ПолеФормы» ));
Элемент . Вид = ВидПоляФормы . ПолеВвода ;
Элемент . ПутьКДанным = «Покупатель» ;

Назначение элементу формы обработчика события:

ЭлементПокупатель . УстановитьДействие ( «ПриИзменении» , «Подключаемый_ПокупательПриИзменении» );

&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении ( Элемент )
// Действия события
КонецПроцедуры

Внимание!

Процедурам, которые устанавливаются в качестве обработчиков событий из кода с помощью метода УстановитьДействие () , рекомендуется задавать префикс Подключаемый_.

Внимание!

Скачать обработку с примерами программного поиска и изменения реквизитов, команд и элементов управляемой формы можно ЗДЕСЬ.

Остались вопросы?
Спросите в комментариях к статье.

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Документы

Описание:

Документ — одно из основных понятий системы 1С:Предприятие. При помощи документов организуется ввод в систему информации о совершаемых хозяйственных операциях, а также ее просмотр и корректировка.

В большинстве своем документы, которые создаются в процессе настройки конфигурации задачи, являются электронными аналогами стандартных бумажных документов, являющихся основаниями для тех или иных учетных действий или расчетов. Тем не менее, использование этого типа данных может выходить далеко за рамки простой фиксации изменений, внесенных в учетные регистры.

Структура каждого конкретного вида документа определяется при его создании в конфигураторе. У любого вида документа существуют реквизиты, которые создаются автоматически — это «Дата» и «Номер». Номер создается, если при конфигурировании длина номера указана больше 0. Другие реквизиты документа определяются в конфигураторе отдельно для каждого создаваемого вида документа.

Документы в языке 1С 8.3, 8.2 (в примерах)

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю).

Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

Обычная задача — перед записью поймать изменение реквизита (пусть это будет реквизит ВремяНачала)и выполнить некоторое действие.
Раньше оно было совсем просто в процедуре ПередЗаписью

Если Ссылка.ВремяНачала <> Объект.ВремяНачала Тогда
// реквизит изменен - выполняем нужные действия
КонецЕсли

Сейчас такой фокус не пройдет — придется написать чуть побольше кода.

&НаСервере
Функция ИзменениеВРасписании(ВремяНачалаАктуальное)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОказаниеУслуг.ВремяНачала
|ИЗ
| Документ.ОказаниеУслуг КАК ОказаниеУслуг
|ГДЕ
| ОказаниеУслуг.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Если Выборка.Следующий() Тогда
ВремяНачалаСохраненное = Выборка.ВремяНачала;
Если ВремяНачалаСохраненное <> ВремяНачалаАктуальное Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции

Ну и используем новую функцию в процедуре ПередЗаписью

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ИзменениеВРасписании(Объект.ВремяНачала) Тогда
// реквизит изменен - выполняем нужные действия
КонецЕсли;
КонецПроцедуры

Понравилась статья? Поделить с друзьями:
  • 1с получить значение реквизита формы по имени
  • 1с получить реквизит справочника номенклатура
  • 1с получить реквизит формы в модуле менеджера
  • 1с при записи проверить изменился ли реквизит
  • 250 часов обязательных работ это сколько дней