При обновлении конфигурации 1С:Управление торговлей (УТ), например, с версии 11.3.4.228 на 11.4.6.188, пользователи часто сталкиваются с ошибкой: {ОбщийМодуль.ОбновлениеИнформационнойБазыСлужебный.Модуль(3657)}: Укажите способ выборки в процедуре регистрации данных к обновлению. Указывается в "Параметры.ПараметрыВыборки.СпособВыборки". Сейчас указан неизвестный способ выборки "". Эта проблема возникает на этапе выполнения фоновых процессов для перехода на новую версию и может быть вызвана различными причинами, такими как прерывание процесса обновления, нехватка ресурсов или особенности данных в информационной базе. Давайте подробно рассмотрим причины этой ошибки и различные подходы к ее устранению.
Прежде чем начать любые действия, критически важно создать полную резервную копию вашей информационной базы. Это позволит избежать потери данных в случае непредвиденных ситуаций.
Данная ошибка сигнализирует о том, что система обновления не может определить, каким образом следует выбирать данные для обработки конкретным обработчиком. Процедура НайтиПорциюДляОбновления в общем модуле ОбновлениеИнформационнойБазыСлужебный отвечает за это, и если параметр Параметры.ПараметрыВыборки.СпособВыборки остается пустым или содержит неизвестное значение, выполнение прерывается. Разберем наиболее частые причины:
Прежде чем приступать к сложным программным решениям, рекомендуем выполнить несколько предварительных шагов:
%USERPROFILE%\AppData\Roaming\1C\1CE\
%USERPROFILE%\AppData\Local\1C\1CE\
Это решение является наиболее адресным, так как оно напрямую устраняет причину ошибки, задавая необходимый способ выборки данных. Мы рассмотрим, как это сделать путем внесения изменений в конфигурацию или создания расширения.
Для того чтобы точно знать, для какого обработчика необходимо прописать способ выборки, мы используем отладчик:
ОбновлениеИнформационнойБазыСлужебный, в процедуре НайтиПорциюДляОбновления, строка 3657 (или рядом с ней, где формируется ошибка).ПараметрыПоиска.ИмяОбработчика. Это и будет имя проблемного обработчика.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию и ОбработатьДанныеДляПереходаНаНовуюВерсию, где определяются необходимые для обновления переменные и способы выборки.После выявления проблемного обработчика, мы можем модифицировать процедуру НайтиПорциюДляОбновления. Это можно сделать либо прямым изменением конфигурации (что не рекомендуется, так как усложняет будущие обновления), либо, что предпочтительнее, через расширение.
Найдите процедуру НайтиПорциюДляОбновления(ПараметрыПоиска, АдресРезультата) Экспорт в общем модуле ОбновлениеИнформационнойБазыСлужебный.
Вставьте следующий код в самое начало этой процедуры. Этот код перехватывает вызов для конкретных обработчиков и принудительно устанавливает параметры выборки.
//ЕАА убрать при следующем обновлении
Если Найти(ПараметрыПоиска.ИмяОбработчика,"РасчетыСКлиентами") <> 0 Тогда
ПараметрыПоиска.ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиРегистраторыРегистра;
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаОбъектов = "Документ.ГрафикИсполненияДоговора, |Документ.ЗаказКлиента, |Документ.ЗаявкаНаВозвратТоваровОтКлиента, |Документ.АктВыполненныхРабот, |Документ.ВводОстатков, |Документ.ВзаимозачетЗадолженности, |Документ.ВозвратТоваровМеждуОрганизациями, |Документ.ВозвратТоваровОтКлиента, |Документ.ВыкупВозвратнойТарыКлиентом, |Документ.КорректировкаРеализации, |Документ.ОперацияПоПлатежнойКарте, |Документ.ОперацияПоЯндексКассе, |Документ.ОтчетКомиссионера, |Документ.ОтчетКомиссионераОСписании, |Документ.ОтчетКомитенту, |Документ.ОтчетПоКомиссииМеждуОрганизациями, |Документ.ОтчетПоКомиссииМеждуОрганизациямиОСписании, |Документ.ПередачаТоваровМеждуОрганизациями, |Документ.ПоступлениеБезналичныхДенежныхСредств, |Документ.ПриходныйКассовыйОрдер, |Документ.РасходныйКассовыйОрдер, |Документ.РеализацияТоваровУслуг, |Документ.РеализацияУслугПрочихАктивов, |Документ.СписаниеБезналичныхДенежныхСредств, |Документ.СписаниеЗадолженности";
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаРегистров = "РегистрНакопления.РасчетыСКлиентами";
ИначеЕсли Найти(ПараметрыПоиска.ИмяОбработчика,"СуммыДокументовВВалютеРегл") <> 0 Тогда
ПараметрыПоиска.ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиРегистраторыРегистра;
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаОбъектов = "Документ.АвансовыйОтчет, |Документ.АктВыполненныхРабот, |Документ.ВзаимозачетЗадолженности, |Документ.ВнесениеДенежныхСредствВКассуККМ, |Документ.ВозвратТоваровМеждуОрганизациями, |Документ.ВозвратТоваровОтКлиента, |Документ.ВозвратТоваровПоставщику, |Документ.ВыкупВозвратнойТарыКлиентом, |Документ.ВыкупВозвратнойТарыУПоставщика, |Документ.ЗаписьКнигиПокупок, |Документ.ЗаписьКнигиПродаж, |Документ.ИнвентаризацияНаличныхДенежныхСредств, |Документ.КорректировкаРегистров, |Документ.НачисленияКредитовИДепозитов, |Документ.ОперацияПоПлатежнойКарте, |Документ.ОперацияПоЯндексКассе, |Документ.ОприходованиеИзлишковТоваров, |Документ.ОтчетБанкаПоОперациямЭквайринга, |Документ.ОтчетКомиссионера, |Документ.ОтчетКомиссионераОСписании, |Документ.ОтчетКомитенту, |Документ.ОтчетКомитентуОСписании, |Документ.ОтчетОРозничныхПродажах, |Документ.ОтчетПоКомиссииМеждуОрганизациями, |Документ.ОтчетПоКомиссииМеждуОрганизациямиОСписании, |Документ.ПередачаТоваровМеждуОрганизациями, |Документ.ПересортицаТоваров, |Документ.ПорчаТоваров, |Документ.ПоступлениеБезналичныхДенежныхСредств, |Документ.ПриобретениеТоваровУслуг, |Документ.ПриобретениеУслугПрочихАктивов, |Документ.ПриходныйКассовыйОрдер, |Документ.ПрочееОприходованиеТоваров, |Документ.РасходныйКассовыйОрдер, |Документ.РеализацияТоваровУслуг, |Документ.РеализацияУслугПрочихАктивов, |Документ.СписаниеБезналичныхДенежныхСредств, |Документ.ВыемкаДенежныхСредствИзКассыККМ, |Документ.СписаниеЗадолженности";
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаРегистров = Метаданные.РегистрыСведений.СуммыДокументовВВалютеРегл.ПолноеИмя;
ИначеЕсли Найти(ПараметрыПоиска.ИмяОбработчика,"СебестоимостьТоваров") <> 0 Тогда
ПараметрыПоиска.ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиРегистраторыРегистра;
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаОбъектов = "Документ.ПеремаркировкаТоваровГИСМ, |Документ.МаркировкаТоваровГИСМ, |Документ.ВнутреннееПотреблениеТоваров, |Документ.РасходныйКассовыйОрдер, |Документ.ВозвратТоваровОтКлиента, |Документ.ПриобретениеТоваровУслуг, |Документ.ТаможеннаяДекларацияИмпорт, |Документ.ОтчетКомиссионера, |Документ.ПервичныйДокумент, |Документ.ВозвратТоваровПоставщику, |Документ.СписаниеБезналичныхДенежныхСредств, |Документ.КорректировкаОбособленногоУчетаЗапасов, |Документ.ВводОстатков, |Документ.ПоступлениеТоваров, |Документ.ПрочиеДоходыРасходы, |Документ.КорректировкаРегистров, |Документ.КорректировкаНалогообложенияНДСПартийТоваров, |Документ.ОтчетПоКомиссииМеждуОрганизациями, |Документ.РаспределениеРасходовБудущихПериодов, |Документ.СписаниеНедостачТоваров, |Документ.ПеремещениеТоваров, |Документ.ЗаявлениеОВвозеТоваров, |Документ.КорректировкаРеализации, |Документ.РеализацияТоваровУслуг, |Документ.КорректировкаНазначенияТоваров, |Документ.ПересортицаТоваров, |Документ.АвансовыйОтчет, |Документ.ОтчетПоКомиссииМеждуОрганизациямиОСписании, |Документ.КорректировкаПриобретения, |Документ.ОтчетКомитентуОСписании, |Документ.ПриобретениеУслугПрочихАктивов, |Документ.АктВыполненныхРабот, |Документ.ОтчетОРозничныхПродажах, |Документ.ОприходованиеИзлишковТоваров, |Документ.ВозвратТоваровМеждуОрганизациями, |Документ.СборкаТоваров, |Документ.ИсправлениеРазвернутогоСальдоТоваровОрганизаций, |Документ.ОтчетКомиссионераОСписании, |Документ.ПередачаТоваровМеждуОрганизациями, |Документ.РасчетСебестоимостиТоваров, |Документ.ПрочееОприходованиеТоваров, |Документ.КорректировкаВидаДеятельностиНДС, |Документ.СчетФактураПолученныйНалоговыйАгент, |Документ.ПорчаТоваров, |Документ.СчетФактураНалоговыйАгент, |";
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаРегистров = Метаданные.РегистрыНакопления.СебестоимостьТоваров.ПолноеИмя;
ИначеЕсли Найти(ПараметрыПоиска.ИмяОбработчика,"ДанныеОснованийСчетовФактур") <> 0 Тогда
ПараметрыПоиска.ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиРегистраторыРегистра;
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаРегистров = "РегистрСведений.ДанныеОснованийСчетовФактур";
ИначеЕсли Найти(ПараметрыПоиска.ИмяОбработчика,"РасчетыСПоставщиками") <> 0 Тогда
ПараметрыПоиска.ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиРегистраторыРегистра;
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаРегистров = "РегистрНакопления.РасчетыСПоставщиками";
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаОбъектов = "Документ.ЗаказПоставщику, |Документ.ГрафикИсполненияДоговора, |Документ.АвансовыйОтчет, |Документ.ВводОстатков, |Документ.ВзаимозачетЗадолженности, |Документ.ВозвратТоваровМеждуОрганизациями, |Документ.ВозвратТоваровПоставщику, |Документ.ВыкупВозвратнойТарыУПоставщика, |Документ.КорректировкаПриобретения, |Документ.ОтчетКомиссионера, |Документ.ОтчетКомитенту, |Документ.ОтчетКомитентуОСписании, |Документ.ОтчетПоКомиссииМеждуОрганизациями, |Документ.ОтчетПоКомиссииМеждуОрганизациямиОСписании, |Документ.ПередачаТоваровМеждуОрганизациями, |Документ.ПоступлениеБезналичныхДенежныхСредств, |Документ.ПриобретениеТоваровУслуг, |Документ.ПриобретениеУслугПрочихАктивов, |Документ.ПриходныйКассовыйОрдер, |Документ.РасходныйКассовыйОрдер, |Документ.СписаниеБезналичныхДенежныхСредств, |Документ.СписаниеЗадолженности, |Документ.ТаможеннаяДекларацияИмпорт";
ИначеЕсли Найти(ПараметрыПоиска.ИмяОбработчика,"ЗаказКлиента") <> 0 Тогда
ПараметрыПоиска.ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиСсылки;
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаОбъектов = "Документ.ЗаказКлиента";
ИначеЕСли Найти(ПараметрыПоиска.ИмяОбработчика,"РеестрДокументов") <> 0 Тогда
ПараметрыПоиска.ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиИзмеренияНезависимогоРегистраСведений;
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаРегистров = "РегистрСведений.РеестрДокументов";
ИначеЕсли Найти(ПараметрыПоиска.ИмяОбработчика,"ВыручкаИСебестоимостьПродаж") <> 0 Тогда
ПараметрыПоиска.ПараметрыВыборки.ПолныеИменаРегистров = "РегистрНакопления.ВыручкаИСебестоимостьПродаж";
ПараметрыПоиска.ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиРегистраторыРегистра;
КонецЕсли;
//ЕАА_
В этом коде мы используем операторы Если Найти(...) <> 0 Тогда ... КонецЕсли; для определения проблемного обработчика по его имени (например, "РасчетыСКлиентами", "СуммыДокументовВВалютеРегл" и т.д.). Для каждого такого обработчика мы принудительно устанавливаем ПараметрыПоиска.ПараметрыВыборки.СпособВыборки в одно из стандартных значений 1С:
ОбновлениеИнформационнойБазы.СпособВыборкиРегистраторыРегистра: используется, когда нужно выбрать документы-регистраторы для определенного регистра.ОбновлениеИнформационнойБазы.СпособВыборкиСсылки: для выборки ссылок на объекты (например, документы).ОбновлениеИнформационнойБазы.СпособВыборкиИзмеренияНезависимогоРегистраСведений: для независимых регистров сведений.Также мы указываем ПолныеИменаОбъектов (для документов) или ПолныеИменаРегистров (для регистров), которые будут обрабатываться данным способом.
Вместо прямого изменения типового модуля, более правильным подходом является создание расширения, которое будет перехватывать вызов процедуры НайтиПорциюДляОбновления и добавлять недостающую логику. Мы можем использовать директиву &Вместо для этого:
&Вместо("НайтиПорциюДляОбновления")
Процедура Временно_НайтиПорциюДляОбновления(ПараметрыПоиска, АдресРезультата)
ПараметрыВыборки = ПараметрыПоиска.ПараметрыВыборки;
Если Не ЗначениеЗаполнено(ПараметрыВыборки.СпособВыборки) Тогда
Если СтрНачинаетсяС(ПараметрыПоиска.ИмяОбработчика,"РегистрыСведений") Тогда
ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиИзмеренияНезависимогоРегистраСведений;
МассивСлов = СтрРазделить(ПараметрыПоиска.ИмяОбработчика, ".");
ПараметрыВыборки.ПолныеИменаРегистров = "РегистрСведений." + МассивСлов[1];
ИначеЕсли СтрНачинаетсяС(ПараметрыПоиска.ИмяОбработчика,"РегистрыНакопления") Тогда
ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиРегистраторыРегистра;
МассивСлов = СтрРазделить(ПараметрыПоиска.ИмяОбработчика, ".");
ПараметрыВыборки.ПолныеИменаРегистров = "РегистрНакопления." + МассивСлов[1];
ИначеЕсли СтрНачинаетсяС(ПараметрыПоиска.ИмяОбработчика,"Документы") Тогда
ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиСсылки;
МассивСлов = СтрРазделить(ПараметрыПоиска.ИмяОбработчика, ".");
ПараметрыВыборки.ПолныеИменаРегистров = "Документ." + МассивСлов[1];
КонецЕсли;
КонецЕсли;
// ... далее стандартная логика процедуры НайтиПорциюДляОбновления
// Вызов оригинальной процедуры, если необходимо, или полный перенос ее тела
КонецПроцедуры
Этот код в расширении проверяет, не заполнен ли СпособВыборки, и пытается определить его на основе префикса имени обработчика (например, если имя начинается с "РегистрыСведений", то устанавливается СпособВыборкиИзмеренияНезависимогоРегистраСведений). Это более универсальный подход, который может покрыть несколько случаев без явного перечисления всех обработчиков. В реальной реализации вам, возможно, потребуется полностью скопировать тело оригинальной процедуры после вашего "перехватывающего" кода, чтобы сохранить ее функциональность.
В некоторых случаях ошибка может возникать не при определении способа выборки для порции данных, а на более раннем этапе — при формировании общей таблицы обрабатываемых данных. Если вы столкнулись с ошибкой "Итератор для значения не определен" или похожей, связанной с реестром документов, это решение может помочь. Мы перехватим процедуру ЗаполнитьТаблицуОбрабатываемыхДанных в обработке РезультатыОбновленияПрограммы и добавим логику для принудительного включения проблемных объектов.
Создайте расширение и в нем для обработки РезультатыОбновленияПрограммы переопределите процедуру ЗаполнитьТаблицуОбрабатываемыхДанных:
Обработка РезультатыОбновленияПрограммы
&НаСервере
&Вместо("ЗаполнитьТаблицуОбрабатываемыхДанных")
Процедура Расш1_ЗаполнитьТаблицуОбрабатываемыхДанных(СведенияОбОбновлении)
ОбъектыОбработчика = Новый Соответствие;
ИсходныеДанные = СведенияОбОбновлении.ОбрабатываемыеДанные;
ТаблицаОбрабатываемыеДанные = РеквизитФормыВЗначение("ОбрабатываемыеДанные");
Для Каждого ИнформацияПоОбработчику Из ИсходныеДанные Цикл
СписокОбъектов = Новый СписокЗначений;
Обработчик = ИнформацияПоОбработчику.Ключ;
ОбрабатываемыеОбъектыПООчередям = ИнформацияПоОбработчику.Значение.ДанныеОбработчика;
Если ОбрабатываемыеОбъектыПООчередям <> Неопределено Тогда
Для Каждого ОбрабатываемыйОбъект Из ОбрабатываемыеОбъектыПООчередям Цикл
ИмяОбъекта = ОбрабатываемыйОбъект.Ключ;
Очередь = ОбрабатываемыйОбъект.Значение.Очередь;
СтрокаТаблицы = ТаблицаОбрабатываемыеДанные.Добавить;
СтрокаТаблицы.Обработчик = Обработчик;
СтрокаТаблицы.ИмяОбъекта = ИмяОбъекта;
СтрокаТаблицы.Очередь = Очередь;
СписокОбъектов.Добавить(ИмяОбъекта);
КонецЦикла;
Иначе
СтрокаТаблицы = ТаблицаОбрабатываемыеДанные.Добавить;
СтрокаТаблицы.Обработчик = Обработчик;
СтрокаТаблицы.ИмяОбъекта = "РегистрСведений.РеестрДокументов";
СтрокаТаблицы.Очередь = 1;
СписокОбъектов.Добавить(ИмяОбъекта);
КонецЕсли;
ОбъектыОбработчика.Вставить(Обработчик, СписокОбъектов);
КонецЦикла;
ОбъектыОбработчикаАдрес = ПоместитьВоВременноеХранилище(ОбъектыОбработчика, УникальныйИдентификатор);
ЗначениеВРеквизитФормы(ТаблицаОбрабатываемыеДанные, "ОбрабатываемыеДанные");
КонецПроцедуры
Этот код перехватывает стандартное заполнение таблицы ОбрабатываемыеДанные. Если для какого-то обработчика ОбрабатываемыеОбъектыПООчередям оказывается Неопределено, он принудительно добавляет в таблицу запись для РегистрСведений.РеестрДокументов с Очередь = 1. Это может помочь, если система ожидает данные по этому регистру, но не находит их в стандартной структуре СведенияОбОбновлении.
Даже если в вашей базе нет распределенной информационной базы (РИБ), 1С использует механизм плана обмена «Обновление информационной базы» для регистрации объектов, которые требуют обработки при переходе на новую версию. Иногда проблемы возникают из-за битых ссылок или некорректно зарегистрированных данных в этом плане обмена.
Этот метод часто помогает при зацикливании обработчиков или когда обновление "зависает" из-за некорректных внутренних ссылок.
Если проблема связана с внутренней структурой базы данных или ее некорректным состоянием, иногда помогает "пересобрать" базу, выгрузив и загрузив ее заново.
Это достаточно необычный, но иногда эффективный способ. Если проблемное фоновое задание "зависло", но не выдает явную ошибку, попробуйте следующее:
В некоторых случаях запуск процесса обновления со специальным параметром в режиме отладки может помочь. Это может изменить внутренние механизмы или порядок выполнения, обходя критические точки.
/C РежимОтладки ЗапуститьОбновлениеИнформационнойБазы
Ошибка «Укажите способ выборки» при обновлении 1С:Управление торговлей является сложной технической проблемой, требующей детального анализа и порой нестандартных решений. Мы рассмотрели различные подходы: от программной модификации логики определения способа выборки и использования расширений до таких методов, как работа с планом обмена и пересоздание базы. Всегда начинайте с резервного копирования и пошагового применения предложенных решений, внимательно отслеживая результаты. Надеемся, что одно из этих решений поможет вам успешно завершить обновление и вернуться к стабильной работе вашей системы.