Странная ошибка обновлятора с патентами

Написал скрипт для обновлятора по созданию новой организации. При это в некоторых базах начала проявляться ошибка.

Функция НастройкиУчетаУСНФормыВызовСервера.СписокПатентов возвращает список значений:

Функция СписокПатентов(Организация, Период) Экспорт
	
	СписокПатентов = Новый СписокЗначений;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Организация",   Организация);
	Запрос.УстановитьПараметр("ДатаНачала",    Период);
	Запрос.УстановитьПараметр("ДатаОкончания", НастройкиУчета.НайтиДатуОкончанияДействия(Период, Организация, "НастройкиСистемыНалогообложения"));
	
	Запрос.Текст =
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ОперацияСПатентом.Патент КАК Патент,
	|	ЕСТЬNULL(Патенты.Наименование, """") КАК Наименование
	|ИЗ
	|	Документ.ОперацияСПатентом КАК ОперацияСПатентом
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Патенты КАК Патенты
	|		ПО ОперацияСПатентом.Патент = Патенты.Ссылка
	|ГДЕ
	|	ОперацияСПатентом.Организация = &Организация
	|	И ОперацияСПатентом.Проведен
	|	И НАЧАЛОПЕРИОДА(ОперацияСПатентом.ДатаНачала, ДЕНЬ) >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
	|	И НАЧАЛОПЕРИОДА(ОперацияСПатентом.ДатаОкончания, ДЕНЬ) <= НАЧАЛОПЕРИОДА(&ДатаОкончания, ДЕНЬ)";
	
	Результат = Запрос.Выполнить();
	Если Не Результат.Пустой() Тогда
		
		Выборка = Результат.Выбрать();
		Пока Выборка.Следующий() Цикл
			
			ПредставлениеПорядкаОтраженияАвансов = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Доходы по патенту ""%1""'"), Выборка.Наименование);
			
			СписокПатентов.Добавить(Выборка.Патент, ПредставлениеПорядкаОтраженияАвансов);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат СписокПатентов;
	
КонецФункции

Мутабельность здесь может быть только от NULL?

Посмотрел список этих документов по ссылке e1cib/list/Документ.ОперацияСПатентом:

По виду формы понял, что он не включен функциональной опцией. Включил через константу ИспользуетсяУСНПатент:

Форма приняла рабочий вид:

Но результат не поменялся. База была на сервере.

Написал аналогичный код не в Обновляторе, он отработал нормально из консоли кода, видимо проблема в COM-соединении.

Решил отладить с помощью трассировки в журнал регистрации:

&Вместо("СписокПатентов")
Функция Расш1_СписокПатентов(Организация, Период)     
	ЗаписьЖурналаРегистрации("Отладка.Вход", ,,, "Организация: " + Организация + " " + ТипЗнч(Организация) + " период:" + Период + " " + ТипЗнч(период));
	
	СписокПатентов = Новый СписокЗначений;
	
	...	
	
	Результат = Запрос.Выполнить();
	Если Не Результат.Пустой() Тогда
		
		Выборка = Результат.Выбрать();
		Пока Выборка.Следующий() Цикл
			...
			СписокПатентов.Добавить(Выборка.Патент, ПредставлениеПорядкаОтраженияАвансов);

			ЗаписьЖурналаРегистрации("Отладка.Цикл", ,,, "Патент: " + Выборка.Патент + " " + ТипЗнч(Выборка.Патент));
			
		КонецЦикла;
		
	КонецЕсли;
	
	ЗаписьЖурналаРегистрации("Отладка.Выход", ,,, "СписокПатентов: " + СписокПатентов.Количество());
	Возврат СписокПатентов;
	
КонецФункции

Но почему-то в журнал регистрации не записывались события.

Я предположил, что проблема в том, что я передаю дату не в том виде, попробовал ее передавать по-другому:

  • v8.date(2026, 01, 01) и v8.Дата(2026, 01, 01) — выдали ошибку, что такого метода нет
  • v8.ОбщегоНазначенияКлиентСервер.СтрокаВДату(«01.01.2026») — сработало, но ошибка была та же.

При обновлении базы вылетала ошибка:

Я решил сделать ТИИ, не помогло. После ТИИ мое расширение удалилось.

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

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

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

Но в отладке увидел, что мутабельных нет.

Даже так не работает:

Причем ругается почему-то о передачи значения с клиента на сервер, хотя модуль менеджера — тоже на сервере.

Тогда я вспомнил, что подобную ошибку уже видел. Это неверная диагностика 1С, связанная с тем, что модуль невидим. Проверил свойства модуля и да, он не доступен для внешнего соединения:

Я перенести код процедуры УстановкаНастроекПоУмолчанию из модуля менеджера НастройкиУчетаНДС в локальную процедуру Обновлятора. Также пришлось записывать еще два других регистра, чтобы они не заполнялись, не попадая в модуль, не доступный для внешнего соединения. Кстати, на файловой базе работает, не работает только на SQL.

//Создаем настройки налога, иначе при создании может возникать ошибка
МесяцУчетнойПолитики = НачалоМесяца(ДатаУчетнойПолитики);
ДанныеЗаполнения = v8.NewObject("Структура", "Период, Организация", МесяцУчетнойПолитики, Организация);
НЗ = v8.РегистрыСведений.НастройкиУчетаНДС.СоздатьНаборЗаписей();
НЗ.Отбор.Организация.Значение = Организация;
НЗ.Отбор.Организация.Использование = Истина;
Запись = НЗ.Добавить();
Запись.Организация = Организация;

//+++В будущем, когда 1с починит модуль НастройкиУчетаНДС (добавит галку внешнее соединение):
//v8.РегистрыСведений.НастройкиУчетаНДС.УстановкаНастроекПоУмолчанию(Запись, ДанныеЗаполнения);
УстановкаНастроекПоУмолчанию(Запись, ДанныеЗаполнения);
НЗ.ОбменДанными.Загрузка = истина; //После исправления ошибки можно убрать
//---
НЗ.Записать(Истина);

//Создаем настройки учетной политики, чтобы они не создавались при записи регистра НастройкиСистемыНалогообложения
НЗ = v8.РегистрыСведений.УчетнаяПолитика.СоздатьНаборЗаписей();
НЗ.Отбор.Организация.Значение = Организация;
НЗ.Отбор.Организация.Использование = Истина;
Запись = НЗ.Добавить();
Запись.Организация = Организация;
v8.РегистрыСведений.УчетнаяПолитика.УстановкаНастроекПоУмолчанию(Запись, ДанныеЗаполнения);
НЗ.ОбменДанными.Загрузка = истина; //После исправления ошибки можно убрать
НЗ.Записать(Истина);

//=== Регистр НастройкиУчетаУСН
НЗ = v8.РегистрыСведений.НастройкиУчетаУСН.СоздатьНаборЗаписей();
НЗ.Отбор.Организация.Значение = Организация;
НЗ.Отбор.Организация.Использование = Истина;
Запись = НЗ.Добавить();
Запись.Период = МесяцУчетнойПолитики;
Запись.Организация = Организация;
НЗ.ОбменДанными.Загрузка = истина; //После исправления ошибки можно убрать
НЗ.Записать(Истина);

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

Вот как много и долго пришлось решать проблему из-за ошибок в типовых 1С. Галочку они пожалели! Уже давно замечаю параноидальное отношение 1С к этим галочкам, просто Святой Грааль какой-то, особенно касается галочки «Вызов сервера», прямо не любят они ее ставить.

Среда: БП 3.0.191.41, 1С 8.3.27.1786. Объем: 3 час.

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

комментариев 10

  1. rzd:

    В итоге ты решил, что дело в галочке, но даже не проверил?

  2. rzd:

    «Причем ругается почему-то о передачи значения с клиента на сервер, хотя модуль менеджера — тоже на сервере.» — чем галочка внешнее соединение поможет?

    • во внешнем соединении не доступно.

      • rzd:

        Что недоступно, если ты уже на сервере как ты сказал?

        • модуль не компилируется во внешнем соединении.

          • rzd:

            У модуля стоит сервер и вызов сервера. Все вызовы будут исполняться на сервере. Зачем ему компилироваться как внешнее соединение? Он вызывается на сервере. Отовсюду

          • рассуждения верные, но это ошибка платформы. в режиме 1с скрипт отрабатывает, из обновлятора нет.

  3. rzd:

    Теперь это уже ошибка платформы. До этого проблема была в конфигурации. Может дело в другом?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *