Групповое исправление инв. номеров в БГУ2.0
Процедуры модуля формы:
&НаСервере
Процедура ВыполнитьНаСервере()
СписокИН = Справочники.ИнвентарныеНомераОС.Выбрать();
Пока СписокИн.Следующий() Цикл
ТекИнвНомер = СписокИН.ПолучитьОбъект();
ТекНовыйПрефикс = "02"+СокрЛП(ТекИнвНомер.ПрефиксКода);
ТекИнвНомер.ПрефиксКода = ТекНовыйПрефикс;
ТекИнвНомер.Код = СокрП(ТекНовыйПрефикс)+ СокрП(ТекИнвНомер.ПорядковыйНомер);
//при выполнении следующей команды зацикливается
ТекИнвНомер.Записать();
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура КнопкаВыполнить(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
ПоказатьНайденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Skaredov,
2. ТекИнвНомер.Записать() - при записи могут отрабатывать разные события. Их надо смотреть
В моей БГУ вижу:
т.е если "УжеЕстьИнвНомер", то 1С попытается вывести сообщение "Для ОС "+ОС+" уже введен инвентарный номер", плюс - установить флаг отказа. Вот и возможная причина "зависания"
2. ТекИнвНомер.Записать() - при записи могут отрабатывать разные события. Их надо смотреть
В моей БГУ вижу:
Процедура ПриЗаписи(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если НЕ ОС.ГрупповойУчет Тогда
Отказ= УжеЕстьИнвНомер(Владелец,ОС);
Если Отказ Тогда
ОбщегоНазначенияБГУ.СообщитьОбОшибке("Для ОС "+ОС+" уже введен инвентарный номер",,,СтатусСообщения.Важное);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показатьт.е если "УжеЕстьИнвНомер", то 1С попытается вывести сообщение "Для ОС "+ОС+" уже введен инвентарный номер", плюс - установить флаг отказа. Вот и возможная причина "зависания"
(1) Skaredov, или так с проверкой на будущии дубли
&НаСервере
Процедура ВыполнитьНаСервере()
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИнвентарныеНомераОС.Ссылка КАК Ссылка,
| ИнвентарныеНомераОС.Владелец КАК Владелец,
| ""02"" + ИнвентарныеНомераОС.ПрефиксКода КАК ТекНовыйПрефикс,
| ВЫРАЗИТЬ(""02"" + ИнвентарныеНомераОС.ПрефиксКода + ИнвентарныеНомераОС.ПорядковыйНомер КАК СТРОКА(30)) КАК Код
|ПОМЕСТИТЬ инв
|ИЗ
| Справочник.ИнвентарныеНомераОС КАК ИнвентарныеНомераОС
|ГДЕ
| НЕ ИнвентарныеНомераОС.ПометкаУдаления
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КОЛИЧЕСТВО(инв.Ссылка) КАК Ссылка,
| инв.Владелец КАК Владелец,
| инв.Код КАК Код
|ПОМЕСТИТЬ Дубли
|ИЗ
| инв КАК инв
|
|СГРУППИРОВАТЬ ПО
| инв.Код,
| инв.Владелец
|
|ИМЕЮЩИЕ
| НЕ КОЛИЧЕСТВО(инв.Ссылка) = 1
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| инв.Ссылка КАК Ссылка,
| инв.Владелец КАК Владелец,
| инв.ТекНовыйПрефикс КАК ТекНовыйПрефикс,
| инв.Код КАК Код,
| Дубли.Код КАК КодДубль
|ИЗ
| инв КАК инв
| ЛЕВОЕ СОЕДИНЕНИЕ Дубли КАК Дубли
| ПО инв.Ссылка = Дубли.Ссылка
| И инв.Владелец = Дубли.Владелец";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.КодДубль) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Инв не установлен из-за дублей "+ ВыборкаДетальныеЗаписи.КодДубль+" "+ВыборкаДетальныеЗаписи.Ссылка;
Сообщение.КлючДанных = ВыборкаДетальныеЗаписи.Ссылка;
Сообщение.Сообщить();
Иначе
ТекИнвНомер = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
ТекИнвНомер.ПрефиксКода = ВыборкаДетальныеЗаписи.ТекНовыйПрефикс;
ТекИнвНомер.Код = ВыборкаДетальныеЗаписи.Код;
ТекИнвНомер.Записать();
КонецЕсли;
КонецЦикла;
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
КонецПроцедуры
&НаКлиенте
Процедура КнопкаВыполнить(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
Показать
(1) Многое из предложенного верно, только ключевой фразой Skaredov является:
Автору данного вопроса необходимо выдать "не рыбу, но удочку".
Так вот, для решения данной проблемы необходимо воспользоваться режимом конфигуратора "Отладчик"
Надо поставить точку останова в строке:
И далее по шагам пройти весь алгоритм записи объекта.
Алгоритм рано или поздно попадёт в процедуру подписки на событие "При установке нового кода справочника"
Там можно выяснить, что к примеру код префикс состоящий только из цифр недопустим.
И если устанавливать, к примеру "02-", то программа заработает.
Так же, в процессе отладки, изучая алгоритм можно понять, что если изменить код так:
то все проверки и процедуры выполняемые перед записью элемента справочника, будут игнорироваться.
Но в этом случае программист должен самостоятельно их выполнять и устанавливать все реквизиты корректными.
//при выполнении следующей команды зацикливается
Автору данного вопроса необходимо выдать "не рыбу, но удочку".
Так вот, для решения данной проблемы необходимо воспользоваться режимом конфигуратора "Отладчик"
Надо поставить точку останова в строке:
ТекИнвНомер.Записать();
И далее по шагам пройти весь алгоритм записи объекта.
Алгоритм рано или поздно попадёт в процедуру подписки на событие "При установке нового кода справочника"
Там можно выяснить, что к примеру код префикс состоящий только из цифр недопустим.
И если устанавливать, к примеру "02-", то программа заработает.
Так же, в процессе отладки, изучая алгоритм можно понять, что если изменить код так:
...
ТекИнвНомер.ОбменДанными.Загрузка = Истина;
ТекИнвНомер.Записать();
...
то все проверки и процедуры выполняемые перед записью элемента справочника, будут игнорироваться.
Но в этом случае программист должен самостоятельно их выполнять и устанавливать все реквизиты корректными.
можно такое групповой обработкой сделать.
Администрирование - поддержка и обслуживание - Корректировка данных -групповое изменение реквизитов.
Дополнительные параметры - перве 2 галки снять остальные поставить три ( показать служебные реквизиты и режим разработчика)
в шапке не забыть выбрать справочник "Инвентарные номера ОС"
в таблице изменить 2 строки
Инв. № ="02"+[Префикс кода]+[Инв. №]
Префикс кода ="02"+[Префикс кода]
жмем изменить реквизиты.
Администрирование - поддержка и обслуживание - Корректировка данных -групповое изменение реквизитов.
Дополнительные параметры - перве 2 галки снять остальные поставить три ( показать служебные реквизиты и режим разработчика)
в шапке не забыть выбрать справочник "Инвентарные номера ОС"
в таблице изменить 2 строки
Инв. № ="02"+[Префикс кода]+[Инв. №]
Префикс кода ="02"+[Префикс кода]
жмем изменить реквизиты.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот