Звіти та обробки 1с

Публікація призначена для тих, кому цікаві неочевидні можливості програмної роботи з формами

Діло було так. Перевірки табличній частині при проведенні документа були додані в невідповідний для цих цілей обробник події "ПередЗапісью". Для самої перевірки викликався серверний код. Налагодження на сервері відключена. В алгоритм перевірки закралася помилка, що викликає виключення при наявності в табличній частині деяких елементів довідника. Ця бомба уповільненої дії спрацювала на документі, в який було додано кілька сотень рядків. Як завжди в процесі заповнення кнопка "Зберегти" жодного разу не натискалася. В результаті збереження насилу заповненого документа виявилося неможливим, а ручний пошук рядків, що заважають записи, за часом був порівнянний з повторним заповненням документа.

Запити до БД були марні - документ не записаний. Зовнішніх обробок заповнення до документа підключено не було і нема чого було підмінити, щоб обробити табличну частину вже відкритого документа. Робота велася в товстому клієнті звичайному додатку, що унеможливлювало застосування методу ПолучітьОкна (). Документ потрібно було рятувати іншим методом.

Тобто ключова ідея виражається всього в одному рядку коду:

НаКліенте
Процедура КнопкаВиполнітьНажатіе (Команда)

ЕтоУправляемаяФормаОбработкі = ТіпЗнч (ЕтаФорма) = Тип ( "УправляемаяФорма");

Якщо НЕ ЕтоУправляемаяФормаОбработкі Тоді // в звичайній формі основний реквізит називається ОбработкаОб'ект,
Об'єкт = ЕтаФорма. ОбработкаОб'ект; // для однотипності коду будемо завжди працювати зі змінною Об'єкт
КонецЕсли;

Якщо НЕ Форма. Відкрита () Тоді
Повідомити ( "Ви вибрали документ, форма якого не відкрита. Спочатку відкрийте форму документа.");
повернення;
КонецЕсли;

Якщо ТіпЗнч (Форма) = Тип ( "УправляемаяФорма") Тоді
Об'ектКопірованія = Форма. об'єкт; // тут не враховуємо, що в рідкісних випадках об'єкт може бути перейменований
ІначеЕслі ТіпЗнч (Форма) = Тип ( "Форма") Тоді
Об'ектКопірованія = Форма. ДокументОб'ект; // тут не враховуємо, що в рідкісних випадках об'єкт може бути перейменований
КонецЕсли;


На сервері
Функція СкопіроватьОб'ектНаСервереВУправляемомПріложеніі (Об'єкт. ІмяМетаданних)
// У керованому додатку будемо розраховувати на дані
ДокументОб'ект = ДанниеФормиВЗначеніе (Об'єкт. Тип ( "ДокументОб'ект." + ІмяМетаданних));
НовийОб'ект = ДокументОб'ект. Скопіювати ();

// Тут можна провести програмну модифікацію документа, наприклад видалити рядки, що заважають записи

# Якщо ТолстийКліентОбичноеПріложеніе Тоді
Функція СкопіроватьОб'ектНаКліентеВОбичномПріложеніі (Об'єкт. ІмяМетаданних)

Якщо ТіпЗнч (Об'єкт) = Тип ( "ДанниеФормиСтруктура") Тоді // дані упр.форми
ДокументОб'ект = ДанниеФормиВЗначеніе (Об'єкт. Тип ( "ДокументОб'ект." + ІмяМетаданних));
НовийОб'ект = ДокументОб'ект. Скопіювати ();
Інакше // об'єкт зі звичайної форми
НовийОб'ект = Об'єкт. Скопіювати ();
КонецЕсли;

// Тут можна провести програмну модифікацію документа, наприклад видалити рядки, що заважають записи

ОткритьЗначеніе (НовийОб'ект); // У звичайному додатку документ можна відкрити без запису в базу даних
КонецФункціі
# КонецЕсли

Схожі статті