gifts2017

Проблемы web-клиента 1С: Предприятие. Исправляем ошибку в 1С: Договорчики 8

Опубликовал Сергей Коробейников (Sergey1CSpb) в раздел Программирование - Практика программирования

Описывается способ обхода ошибки, возникающей в web-клиенте при программном изменении видимости элементов формы в процессе записи и закрытия. Ошибка была выявлена в типовой конфигурации 1С: Договорчики 8, но, вполне вероятно, может встречаться и в иных ситуациях. Предложен способ обхода с использованием механизма расширений 1С: Предприятие 8.3, что позволяет не вносить изменения в типовую конфигурацию.

1С в самом конце 2015 года представила новый продукт 1С: Договорчики. Продукт, на мой взгляд, из-за своей простоты и низкой стоимости будет востребован в организациях с несложным договорным регламентом для подготовки, редактирования, согласования и отслеживания договоров.

Мы провели первое внедрение у Заказчика с географически распределенной структурой. Причем основная договорная работа происходит в центральном офисе компании, а в удаленном эксперты могут только проводить согласование. Для упрощения развертывания и поддержки Системы в удаленном подразделении было решено организовать рабочие места в режиме web-клиента.

В центральном офисе был успешно поднят web-сервер и сделаны необходимые разрешения для удаленного доступа. На этапе тестирования в web-клиенте (только в нем!) столкнулись со следующей ошибкой при нажатии кнопки Записать и закрыть в карточке договора (элемента справочника «Договорные документы»):

 

Текст ошибки мог немного варьироваться.

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

При этом, последовательное интерактивное выполнение двух операций: записи элемента (кнопка Записать) и закрытия (кнопка Закрыть) отрабатывало нормально и ошибок не вызывало.

Мы пробовали: обновить конфигурацию/платформу, настраивать web-сервер в соответствии с многочисленными рекомендациями, сменить web-сервер, перейти с файловой на серверную версию платформы. Не помогло. Обратились на линию консультаций 1С. После долгой переписки получили ответ вида: «Ваша проблема зарегистрирована и передана в службу разработки».

Устав от ожиданий, попробовали выявить и решить проблему своими силами. Проведенные исследования показали, что ошибка вызывается при выполнении процедуры ОбновитьДекорации() модуля формы справочника «Договорные документы», а именно при установке и последующей смене видимости одного или нескольких элементов ДекорацияПросрочка3, ДекорацияПросрочка4 и ДекорацияПросрочка5. Процедура вызывается из обработчика события При записи:

&НаКлиенте
Процедура ОбновитьДекорации()
               
                Элементы.ДекорацияПросрочка3.Видимость = Ложь;
                Элементы.ДекорацияПросрочка4.Видимость = Ложь;
                Элементы.ДекорацияПросрочка5.Видимость = Ложь;
                              
                ЕстьПроблемы = Ложь;
               
                Если Не Объект.Закрыт Тогда
                               Если ЗначениеЗаполнено(Объект.ДатаОкончанияДействия)
                                               И Объект.ДатаОкончанияДействия < НачалоДня(ТекущаяДата()) Тогда
                                               ДнейПросрочки = (НачалоДня(ТекущаяДата()) - НачалоДня(Объект.ДатаОкончанияДействия)) / (24*3600);
                                               Элементы.ДекорацияПросрочка.Заголовок = СтрШаблон(
                                                               НСтр("ru = 'Срок действия документа истек %1 %2 назад!'"),
                                                               Строка(ДнейПросрочки), ПолучитьПодписьДней(ДнейПросрочки));
                                               Элементы.ДекорацияПросрочка.Видимость = Истина;
                                               ЕстьПроблемы = Истина;
                               Иначе
                                               Элементы.ДекорацияПросрочка.Видимость = Ложь;
                               КонецЕсли;
                              
                               ПросроченныйЭтап = ""; КоличествоПросроченных = 0;
                               Для Каждого Строка Из Объект.Этапы Цикл
                                               Если ЗначениеЗаполнено(Строка.Срок) И Не Строка.Пройден
                                                               И КонецДня(Строка.Срок) < КонецДня(ТекущаяДата()) Тогда
                                                               ДнейПросрочки = (КонецДня(ТекущаяДата()) - КонецДня(Строка.Срок)) / (24*3600);
                                                               ПросроченныйЭтап = Строка.Этап;
                                                               КоличествоПросроченных = КоличествоПросроченных + 1;
                                               КонецЕсли;
                               КонецЦикла;
                              
                               Если КоличествоПросроченных = 1 Тогда
                                               Элементы.ДекорацияПросрочка2.Заголовок = СтрШаблон(
                                                               НСтр("ru = 'Этап ""%1"" просрочен на %2 %3!'"),
                                                               ПросроченныйЭтап, Строка(ДнейПросрочки), ПолучитьПодписьДней(ДнейПросрочки));
                               ИначеЕсли КоличествоПросроченных > 1 Тогда
                                               Элементы.ДекорацияПросрочка2.Заголовок = СтрШаблон(
                                                               НСтр("ru = 'Этапы (%1) просрочены!'"),
                                                               Строка(КоличествоПросроченных));
                               КонецЕсли;
                              
                               Элементы.ДекорацияПросрочка2.Видимость = КоличествоПросроченных > 0;
                               ЕстьПроблемы = ЕстьПроблемы Или КоличествоПросроченных > 0;
                              
                Иначе
                               Элементы.ДекорацияПросрочка2.Видимость = Ложь;
                               Элементы.ДекорацияПросрочка.Видимость = Ложь;
                               ЕстьПроблемы = Истина;
                КонецЕсли;
               
                Если Не (ЕстьПроблемы Или Элементы.ДекорацияПросрочка1.Видимость) Тогда
                               Строки = Объект.Согласующие.НайтиСтроки(Новый Структура("РезультатСогласования",
                                               ПредопределенноеЗначение("Перечисление.РезультатыСогласования.ПустаяСсылка")));
                               Если Строки.Количество() > 0 Тогда
                                               Элементы.ДекорацияПросрочка3.Видимость = Истина;
                               КонецЕсли;
                              
                               Строки = Объект.Этапы.НайтиСтроки(Новый Структура("Пройден", Ложь));
                               Если Строки.Количество() > 0 Тогда
                                               Элементы.ДекорацияПросрочка5.Видимость = Истина;
                               КонецЕсли;
                              
                               Если ЗначениеЗаполнено(ТекстПередачи) Тогда
                                               Элементы.ДекорацияПросрочка4.Видимость = Истина;
                               КонецЕсли;
                КонецЕсли;
               
КонецПроцедуры

 

 

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

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

Сложность грамотной реализации задуманного состоит в невозможности (? не уверен) отличия исполнения события ПриЗаписи по нажатии кнопки Записать и закрыть от других способов записи. Поэтому, было принято решение в форме, добавленной в расширение, подменить стандартную кнопку Записать и закрыть на обычную кнопку с привязкой команды с нестандартным обработчиком (процедура Расш1_ЗаписатьЗакрыть).

 

 

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

&НаСервере
Процедура ЗаписатьЗакрытьСервер()
	
	Записать();
	
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ЗаписатьЗакрыть(Команда)
	
	ЗаписатьЗакрытьСервер();
	Закрыть();
	
КонецПроцедуры
 

Таким несложным способом практически незаметно для пользователей была исправлена ошибка работы web-клиента для поставки 1С: Договорчики 8. Почему почти? Некоторые пользователи заметили пропадание уведомления о записи в правом нижнем углу экрана.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Никита Грызлов (nixel) 13.07.16 10:04
Интересный способ обхода багов типовых, надо взять на заметку :)
Только поправьте в статье - в упр форме не существует события ПриЗаписи. Даже если бы оно было, то из него никак бы нельзя было вызвать клиентскую процедуру.
2. Сергей Коробейников (Sergey1CSpb) 13.07.16 10:36
(1) nixel, Спасибо!
Ну да, маленькая неточность. Думаю поменять на "События, связанные с записью".

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