Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
05 дек 2023, 10:51

Отмена проведения документа

Автор filomonko, 25 мая 2022, 17:38

0 Пользователей и 1 гость просматривают эту тему.

filomonko

Здравствуйте!)  :btbzdb:
Нужна помощь))
Есть документ "БронированиеНомеров". Есть документ "ОтменаБронирования".
При проведении документа "БронированиеНомеров" в регистр сведений "СтатусНомера" записывается статус "Забронирован". А при проведении документа "ОтменаБронирования" у номера ставится статус "Свободен".
Необходимо сделать так, чтобы после проведения документа "ОтменаБронирования" у документа "БронированиеНомеров", номер которого уже свободен, отменялось проведение.
Код Модуля объекта "БронированиеНомеров":
Процедура ОбработкаПроведения(Отказ, РежимПроведения)

// регистр СтатусНомера
Движения.СтатусНомера.Записывать = Истина;
Для Каждого ТекСтрокаТЧ Из ТЧ Цикл
Движение = Движения.СтатусНомера.Добавить();
Движение.Период = Дата;
Движение.Номер = ТекСтрокаТЧ.Номер;
Движение.Статус = Перечисления.СтатусНомера.Забронирован;
КонецЦикла;

// регистр РезервНомера
Движения.РезервНомера.Записывать = Истина;
Для Каждого ТекСтрокаТЧ Из ТЧ Цикл
Движение = Движения.РезервНомера.Добавить();
Движение.Номер = ТекСтрокаТЧ.Номер;
Движение.Категория = ТекСтрокаТЧ.Категория;
Движение.Клиент = Клиент;
Движение.ДатаЗаезда = ДатаЗаезда;
Движение.ДатаВыезда = ДатаВыезда;
КонецЦикла;

КонецПроцедуры
Код Модуля объекта "ОтменаБронирования":
Процедура ОбработкаПроведения(Отказ, Режим)

// регистр СтатусНомера
Движения.СтатусНомера.Записывать = Истина;
Движение = Движения.СтатусНомера.Добавить();
Движение.Период = Дата;
Движение.Номер = Комната;
Движение.Статус = Перечисления.СтатусНомера.Свободен;

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

ДокБронь.png
ДокОтмена.png
РегСтат.png


alexandr_ll

filomonko, А после отмены бронирования и отмены проведения документа "Бронирование" есть возможность заново провести документ "Бронирование"? Возможно. следует его помечать на удаление?

filomonko

alexandr_ll, думаю, стоит помечать его на удаление

alexandr_ll

filomonko, Дума следует в реквизиты документа "Отмена бронирования" добавить ссылку на документ "Бронирование" и вводить отмену на основании бронирования с заполнением этого реквизита. Тогда обработка документа бронирования будет доступна по ссылке.

filomonko


alexandr_ll

filomonko, Ну вот у вас в Документе "Отмена" видны реквизиты Номер, Дата, Комната. А нужен еще реквизит "Бронирование" с типом Документ.Ссылка. При заполнении документа это поле должно быть заполнено и при проведении этот документ будет доступен по ссылке. https://infostart.ru/1c/articles/333200/

Ввод на основании

На основе простого примера показана реализация механизма ввода на основании.

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

Рассмотрим работу механизма ввода на основании на следующем примере: Организация оказывает услуги пассажирского такси. Заказы покупателей регистрируются в документе «Заказ». Заказ может быть формируется диспетчером. Документ «Заказ» содержит следующую информацию:

  1. имя клиента
  2. адрес клиента
  3. адрес откуда
  4. адрес куда
  5. время подачи
  6. желаемый класс автомобиля
  7. список желаемых опций

Имя клиента, его адрес и телефон хранятся в справочнике «Клиенты». В данном примере будет реализован ввод документа на основании справочника. С целью упрощения примера справочник будет только один - «Клиенты», вся остальная информация будет вводиться вручную.

Создание объектов конфигурации

Справочник "Клиенты":

Документ «Заказ»:

Реализация

В свойствах документа «Заказ» перейдем на закладку «Ввод на основании»:

Нажмем кнопку «Редактировать элемент списка» и выберем из списка справочник «Клиенты»:

Далее запустим конструктор ввода на основании нажатием на кнопку "Конструктор ввода на основании":

В открывшемся окне нужно сопоставить поля справочника с реквизитами документа заказа. Это можно сделать, нажав кнопку «Заполнить выражения» и тогда система попытается сама определить, какие поля необходимо скопировать:

Поле адреса нужно сопоставлять вручную, выбрав поле «АдресОткуда» в нижней части, а затем двойным щелчком на реквизите «Адрес» в реквизитах объекта обоснования:

По нажатию «ОК» система генерирует следующий код в модуле документа «Заказ» в процедуре ОбработкаЗаполнения:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда
// Заполнение шапки
АдресОткуда = ДанныеЗаполнения.Адрес;
Клиент = ДанныеЗаполнения.Ссылка;
Телефон = ДанныеЗаполнения.Телефон;
КонецЕсли;
//}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры

Процедура ОбработкаЗаполнения вызывается в ряде случаев, таких как ввод нового документа интерактивно и ввод на основании. В данном случае, если переменная ДанныеЗаполнения является ссылкой на справочник клиентов, выполняется заполнение реквизитов документа. Код обработчика можно модифицировать. Предположим, что клиенты чаще всего хотят подачу такси в течение 15-20 минут. Тогда в код обработчика можно добавить инициализацию реквизита «ВремяПодачи». Также удалим комментарии, созданные конструктором:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда
АдресОткуда = ДанныеЗаполнения.Адрес;
Клиент = ДанныеЗаполнения.Ссылка;
Телефон = ДанныеЗаполнения.Телефон;
ВремяПодачи = ТекущаяДата() + 900; // 15 * 60 секунд
КонецЕсли;
КонецПроцедуры

Запустим приложение в режиме отладки и проверим, как работает ввод на основании. Добавим пару записей в справочник клиентов:

Откроем одну из них. В окне будет доступна кнопка «Создать на основании», по нажатию которой откроется список с опцией выбора «Заказ»:

При выборе «Заказ» система создает пустой документ и заполняет поля в процедуре ОбработкаЗаполнения:

Сохраним документ и убедимся, что документ был успешно создан, открыв его из спиcка документов заказа:

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

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда
// Заполнение шапки
АдресОткуда = ДанныеЗаполнения.Адрес;
Клиент = ДанныеЗаполнения.Ссылка;
Телефон = ДанныеЗаполнения.Телефон;
ВремяПодачи = ТекущаяДата() + 900; // 15 * 60 секунд

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

Запустим конфигурацию в режиме отладки и посмотрим, что получилось. Добавим опции клиенту:

Сохраним данные и создадим заказ на основании записи справочника:

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


filomonko


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск