Доброго дня!
Предпринята попытка обновить конфигурацию УТ версии 3.1.5 до 3.2.
База тестовая. Размер не малый, клиент-сервер, БД MS SQL Server 2017. База на SSD диске, памяти достаточно.
Активно используется документ регистрации цен поставщиков.
Обновление проходит нормально (практически).
Проблема присутствует при выполнении обработчиков отложенного обновления.
В частности, процедура "Документы.РегистрацияЦенНоменклатурыПоставщика.ЗаполнитьВидЦеныПоставщикаВТабличнойЧастиТовары".
Выполняется сутками!
Текст процедуры, которая выполняется.// Обработчик обновления BAS УТ 3.2.1
// Заполняет "ВидЦеныПоставщика" в табличных частях документа и обновляет движения по регистру сведений ЦеныНоменклатурыПоставщиков
Процедура ЗаполнитьВидЦеныПоставщикаВТабличнойЧастиТовары(Параметры) Экспорт
ПолноеИмяОбъекта = "Документ.РегистрацияЦенНоменклатурыПоставщика";
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Результат = ОбновлениеИнформационнойБазы.СоздатьВременнуюТаблицуСсылокДляОбработки(
Параметры.Очередь,
ПолноеИмяОбъекта,
МенеджерВременныхТаблиц
);
Если НЕ Результат.ЕстьДанныеДляОбработки Тогда
Параметры.ОбработкаЗавершена = Истина;
Возврат;
КонецЕсли;
Если НЕ Результат.ЕстьЗаписиВоВременнойТаблице Тогда
Параметры.ОбработкаЗавершена = Ложь;
Возврат;
КонецЕсли;
ЗапросПоДокументам = Новый Запрос;
ЗапросПоДокументам.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
ЗапросПоДокументам.Текст = "
|ВЫБРАТЬ
| Т.Ссылка КАК Ссылка,
| Т.Ссылка.Партнер КАК Партнер,
| Т.Ссылка.УдалитьСоглашение КАК Соглашение,
| Т.Ссылка.УдалитьСоглашение.ВидЦеныПоставщика КАК ВидЦеныПоставщика
|ИЗ
| Документ.РегистрацияЦенНоменклатурыПоставщика.Товары КАК Т
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДляОбработки КАК ДокументыКОбработке
| ПО Т.Ссылка = ДокументыКОбработке.Ссылка
|ГДЕ
| Т.Ссылка.Проведен
| И (Т.ВидЦеныПоставщика = ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка)
| И ЕСТЬNULL(Т.Ссылка.УдалитьСоглашение, ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка)) <> ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка))
|";
ЗапросПоДокументам.Текст = СтрЗаменить(ЗапросПоДокументам.Текст, "ВТДляОбработки", Результат.ИмяВременнойТаблицы);
Выборка = ЗапросПоДокументам.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(ПолноеИмяОбъекта);
ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка);
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЦеныНоменклатурыПоставщиков.НаборЗаписей");
ЭлементБлокировки.УстановитьЗначение("Регистратор", Выборка.Ссылка);
Блокировка.Заблокировать();
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
// Если объект ранее был удален или обработан другими сеансами, пропускаем его
Если ДокументОбъект = Неопределено Тогда
ОтменитьТранзакцию();
ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(Выборка.Ссылка);
Продолжить;
КонецЕсли;
Для Каждого СтрокаТовары Из ДокументОбъект.Товары Цикл
Если Не ЗначениеЗаполнено(СтрокаТовары.ВидЦеныПоставщика) Тогда
СтрокаТовары.ВидЦеныПоставщика = Выборка.ВидЦеныПоставщика;
КонецЕсли;
КонецЦикла;
ДокументОбъект.УдалитьСоглашение = Неопределено;
ОбновлениеИнформационнойБазы.ЗаписатьДанные(ДокументОбъект);
НаборЗаписей = РегистрыСведений.ЦеныНоменклатурыПоставщиков.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = ДокументОбъект.Ссылка;
НаборЗаписей.Отбор.Регистратор.Использование = Истина;
НаборЗаписей.Прочитать();
Если НаборЗаписей.Выбран() Тогда
Для Каждого СтрокаНабора Из НаборЗаписей Цикл
Если НЕ ЗначениеЗаполнено(СтрокаНабора.ВидЦеныПоставщика) Тогда
СтрокаНабора.ВидЦеныПоставщика = Выборка.ВидЦеныПоставщика;
КонецЕсли;
СтрокаНабора.Соглашение = Неопределено;
СтрокаНабора.Партнер = Выборка.Партнер;
КонецЦикла;
ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ОбновлениеИнформационнойБазыУТ.СообщитьОНеудачнойОбработке(Выборка.Ссылка);
КонецПопытки;
КонецЦикла;
Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(
Параметры.Очередь,
ПолноеИмяОбъекта
);
КонецПроцедуры
Что-то мне подсказывает, что долго. По всей видимости - причина в количестве строк в документах, запись данных большими порциями.
Исправить можно только через разбиение на более мелкие документы? Или есть еще варианты оптимизации?
Пытался ли кто управлять последовательностью выполнения обработчиков отложенного обновления?
Хотелось бы посмотреть на эту разработку, но не бесплатная она: [необходимо зарегистрироваться для просмотра ссылки]
На этом проблемы с обновлением не заканчиваются, к сожалению.
Так как не все обработки отложенного обновления выполнены - при открытии документа (к примеру, заказа покупателя) выдается ошибка "Недостаточно фактических параметров".
Ошибка возникает при вызове необходимых обработчиков при открытии формы, но вылетает. Как бороться? Перепроверять все доки, все процедуры?
{(1)}: Недостаточно фактических параметров
Документы.РасходныйОрдерНаТовары.РасходныеОрдераОбновленыНаНовуюВерсию(Параметры)
Есть подозрение, что разработчики не тестировали обновление на больших базах.
Кто-то уже переходил на УТ BAS? Как успехи, какие впечатления?
О себе:
1С:Предприятие 8.3 (8.3.13.1809)
BAS Управление торговлей, редакция 3.2 (3.2.8.1)