Установка границы последовательностей без перепроведения документов
Доброго времени суток!
Есть необходимость установить программно границу последовательностей без перепроведения документов за прошлый период.
Почитал СП, набросал код:
Граница не меняется.
Платформа 8.2.19.90 Конфигурация "Мебельное производство" от ПартнерСофта
В чем может быть причина?
Заранее спасибо, а то уже весь интернет перерыл в поисках ответа.
Есть необходимость установить программно границу последовательностей без перепроведения документов за прошлый период.
Почитал СП, набросал код:
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Справочники.Номенклатура.НайтиПоКоду("25"));
Последовательности.СписаниеТМЦ.УстановитьГраницу(Момент, Отбор);
Граница не меняется.
Платформа 8.2.19.90 Конфигурация "Мебельное производство" от ПартнерСофта
В чем может быть причина?
Заранее спасибо, а то уже весь интернет перерыл в поисках ответа.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Al_Capone, вообще покопайся в типовых,
там целый общий модуль посвящен работами с последовательностями.
причем, они его существенно изменили.
Вот рабочая функция из старой бухни, причем в последних конфах ее выпилили.
там целый общий модуль посвящен работами с последовательностями.
причем, они его существенно изменили.
Вот рабочая функция из старой бухни, причем в последних конфах ее выпилили.
Функция УстановитьПоследовательность(Организация, ДатаНачала, ДатаОкончания) Экспорт
МоментСледующегоДокумента = Неопределено;
// Для изменения состояний в последовательности блокируем последовательность
// в целом по организации.
// Установка управляемой блокировки возможно только в рамках транзакции.
// В случае возникновения ошибок отменяем транзакцию.
НачатьТранзакцию();
Попытка
РаботаСПоследовательностями.УстановитьБлокировкуПоследовательностиПоОрганизации(Организация);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаПоследовательности.Регистратор
|ИЗ
| Последовательность.ДокументыОрганизаций КАК ТаблицаПоследовательности
|ГДЕ
| ТаблицаПоследовательности.Организация = &Организация
| И &УсловиеПериод
| И ТаблицаПоследовательности.СостояниеПроведения В (ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ПроведенСНарушениемПоследовательности), ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности))";
ТекстУсловиеПериод = "";
Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) Тогда
ТекстУсловиеПериод = "ТаблицаПоследовательности.Период МЕЖДУ &ДатаНачала И &ДатаОкончания";
ИначеЕсли ЗначениеЗаполнено(ДатаНачала) Тогда
ТекстУсловиеПериод = "ТаблицаПоследовательности.Период >= &ДатаНачала";
ИначеЕсли ЗначениеЗаполнено(ДатаОкончания) Тогда
ТекстУсловиеПериод = "ТаблицаПоследовательности.Период <= &ДатаОкончания";
КонецЕсли;
Если ЗначениеЗаполнено(ТекстУсловиеПериод) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеПериод", ТекстУсловиеПериод);
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И &УсловиеПериод", "");
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
НаборЗаписей = Последовательности.ДокументыОрганизаций.СоздатьНаборЗаписей();
Пока Выборка.Следующий() Цикл
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Прочитать();
ВГраница = НаборЗаписей.Количество() - 1;
Для Сч = 0 По ВГраница Цикл
// Удаляем с конца набора
Движение = НаборЗаписей[ВГраница - Сч];
// У документа могут быть записи последовательности по нескольким организациям,
// если у него ранее меняли реквизит Организация, поэтому обрабатываем
// только записи по текущей организации.
Если Движение.Организация = Организация Тогда
Если Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности Тогда
НаборЗаписей.Удалить(Движение);
Иначе
Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ПроведенВПоследовательности;
КонецЕсли;
КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
Если ЗначениеЗаполнено(ДатаОкончания) Тогда
// Следующий по очереди документ объявляем проведенным с нарушением,
// чтобы с него начать потом перепроведение.
МоментСледующегоДокумента = РаботаСПоследовательностями.МоментВремениПервогоДокументаВПоследовательности(Организация, ДатаОкончания + 1);
Если МоментСледующегоДокумента <> Неопределено Тогда
РаботаСПоследовательностями.СброситьСостояниеПоследовательностиДокумента(
МоментСледующегоДокумента.Ссылка,
МоментСледующегоДокумента.Дата,
Организация);
КонецЕсли;
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ТекстОшибки = ОписаниеОшибки();
ОписаниеОшибки = ИнформацияОбОшибке();
ОтменитьТранзакцию();
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
ЗаписьЖурналаРегистрации(НСтр("ru = 'Операция не выполнена'"), УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки.Описание);
ВызватьИсключение ТекстОшибки;
КонецПопытки;
Возврат МоментСледующегоДокумента;
КонецФункции
Показать
Получилось добавить запись в последовательность, но при этом граница все равно не верная! Она актуальна на первую запись, при этом регистратор удален(обстоятельства не известны), и не только у этой записи(см. скриншот). Вопрос: как удалить все записи?
Прикрепленные файлы:
Даю свой пример.
Где:
ИмяПоследовательности - Имя вашей последовательности
ДатаДокумент - реквизит (тип либо дата либо документ)
Организация - реквизит Организация
Если ТипЗнч(ДатаДокумент) = Тип("Дата") Тогда
МоментВремениДокумента = Новый МоментВремени(ДатаДокумент);
Иначе
МоментВремениДокумента = Новый МоментВремени(ДатаДокумент.Дата, ДатаДокумент);
КонецЕсли;
Отбор = Новый Структура("Организация", Организация);
НачатьТранзакцию();
Последовательности[ИмяПоследовательности].УстановитьГраницу(МоментВремениДокумента, Отбор);
Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
| Последовательность.Регистратор
|ИЗ
| Последовательность."+ИмяПоследовательности+" КАК Последовательность
|ГДЕ
| Последовательность.Период < &Дата
| И Последовательность.Организация = &Организация");
Запрос.УстановитьПараметр("Дата", МоментВремениДокумента.Дата);
Запрос.УстановитьПараметр("Организация", Организация);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
НаборЗаписей = Последовательности[ИмяПоследовательности].СоздатьНаборЗаписей();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Прочитать();
НаборЗаписей.Записать();
КонецЦикла;
КонецЕсли;
ЗафиксироватьТранзакцию();
ПоказатьГде:
ИмяПоследовательности - Имя вашей последовательности
ДатаДокумент - реквизит (тип либо дата либо документ)
Организация - реквизит Организация
(9) Obvious, из Последовательности.ИмяПоследовательности я итак все записи удалил. Там было около полумиллиона записей. На скриншоте(см. выше) я выбириал записи из таблицы Последовательность.ИмяПоследовательности.Границы, там полторы тысячи записей, больше чем у половины регистратор это либо <Объект не найден> либо неопределено! Как эти записи почистить/исправить?
(15) Martinian, предыстория мне и самому интересна. Предположение такое: пытались автоматом перенести остатки из 7.7, видимо не очень получилось, потом делали ввод остатков вручную, а после некоторые документы удалялись непосредственно. Вот как-то так. А теперь это дело надо поправить.
Решение было принято следующее:
Удалить записи последовательности непосредственно из таблицы БД(внутренней).
Способов 2:
Для файлового варианта - Использовать Tool_1CD(альфа версия умеет удалять записи)
Для SQL - средствами sql.
Посмотреть названия таблиц можно с помощью ПолучитьСтруктуруХраненияБазыДанных(Массив).
Как пользоваться можно посмотреть в СП.
Если ни у кого предложений нет, вопрос можно считать закрытым.
Всем спасибо за помощь!
Удалить записи последовательности непосредственно из таблицы БД(внутренней).
Способов 2:
Для файлового варианта - Использовать Tool_1CD(альфа версия умеет удалять записи)
Для SQL - средствами sql.
Посмотреть названия таблиц можно с помощью ПолучитьСтруктуруХраненияБазыДанных(Массив).
Как пользоваться можно посмотреть в СП.
Если ни у кого предложений нет, вопрос можно считать закрытым.
Всем спасибо за помощь!
(20)Можно использовать процедуру из комментария (9) Положить в общий модуль расширения и закомментировать 1 строку содержащую "УстановитьБлокировкуПоследовательностиПоОрганизации"
Если в конфигурации ведется одна организация, то можно просто очистить последовательность штатным способом
Еще одна важная деталь, про которую многие забывают, а она непосредственно влияет на начальную границу контроля последовательности - это "дата начала ведения учета", настраивается в учетной политике организации хранится в РегистрСведений.УчетнаяПолитика.Период. Очень часто возникают проблемы после свертки базы, т.к. записи регистра учетная политика за старые периоды остаются в базе после свертки. Это как правило вызывает ошибки учета 1С, когда программа 1С Бухгалтерия просит регламентное закрытие месяца в старых периодах, где учет не ведется.
Программно "дату начала ведения учета" можно получить функцией
Функция проверена на БП 3.0.102.11 - в нее передаете ДатаОкончания. В результате с этой даты + первый документ свежее этой даты - это и будет начало периода перепроведения в закрытии месяца.
Если в конфигурации ведется одна организация, то можно просто очистить последовательность штатным способом
РаботаСПоследовательностями.ОчиститьПоследовательностьДокументыОрганизаций()
Еще одна важная деталь, про которую многие забывают, а она непосредственно влияет на начальную границу контроля последовательности - это "дата начала ведения учета", настраивается в учетной политике организации хранится в РегистрСведений.УчетнаяПолитика.Период. Очень часто возникают проблемы после свертки базы, т.к. записи регистра учетная политика за старые периоды остаются в базе после свертки. Это как правило вызывает ошибки учета 1С, когда программа 1С Бухгалтерия просит регламентное закрытие месяца в старых периодах, где учет не ведется.
Программно "дату начала ведения учета" можно получить функцией
РаботаСПоследовательностями.ДатаНеРанееНачалаУчета(Организация)
Функция проверена на БП 3.0.102.11 - в нее передаете ДатаОкончания. В результате с этой даты + первый документ свежее этой даты - это и будет начало периода перепроведения в закрытии месяца.
Функция УстановитьПоследовательность(Организация, ДатаНачала, ДатаОкончания) Экспорт
МоментСледующегоДокумента = Неопределено;
// Для изменения состояний в последовательности блокируем последовательность
// в целом по организации.
// Установка управляемой блокировки возможно только в рамках транзакции.
// В случае возникновения ошибок отменяем транзакцию.
НачатьТранзакцию();
Попытка
// РаботаСПоследовательностями.УстановитьБлокировкуПоследовательностиПоОрганизации(Организация);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаПоследовательности.Регистратор
|ИЗ
| Последовательность.ДокументыОрганизаций КАК ТаблицаПоследовательности
|ГДЕ
| ТаблицаПоследовательности.Организация = &Организация
| И &УсловиеПериод
| И ТаблицаПоследовательности.СостояниеПроведения В (ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ПроведенСНарушениемПоследовательности), ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности))";
ТекстУсловиеПериод = "";
Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) Тогда
ТекстУсловиеПериод = "ТаблицаПоследовательности.Период МЕЖДУ &ДатаНачала И &ДатаОкончания";
ИначеЕсли ЗначениеЗаполнено(ДатаНачала) Тогда
ТекстУсловиеПериод = "ТаблицаПоследовательности.Период >= &ДатаНачала";
ИначеЕсли ЗначениеЗаполнено(ДатаОкончания) Тогда
ТекстУсловиеПериод = "ТаблицаПоследовательности.Период <= &ДатаОкончания";
КонецЕсли;
Если ЗначениеЗаполнено(ТекстУсловиеПериод) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеПериод", ТекстУсловиеПериод);
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И &УсловиеПериод", "");
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
НаборЗаписей = Последовательности.ДокументыОрганизаций.СоздатьНаборЗаписей();
Пока Выборка.Следующий() Цикл
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Прочитать();
ВГраница = НаборЗаписей.Количество() - 1;
Для Сч = 0 По ВГраница Цикл
// Удаляем с конца набора
Движение = НаборЗаписей[ВГраница - Сч];
// У документа могут быть записи последовательности по нескольким организациям,
// если у него ранее меняли реквизит Организация, поэтому обрабатываем
// только записи по текущей организации.
Если Движение.Организация = Организация Тогда
Если Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности Тогда
НаборЗаписей.Удалить(Движение);
Иначе
Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ПроведенВПоследовательности;
КонецЕсли;
КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
Если ЗначениеЗаполнено(ДатаОкончания) Тогда
// Следующий по очереди документ объявляем проведенным с нарушением,
// чтобы с него начать потом перепроведение.
МоментСледующегоДокумента = РаботаСПоследовательностями.МоментВремениПервогоДокументаВПоследовательности(Организация, ДатаОкончания + 1);
Если МоментСледующегоДокумента <> Неопределено Тогда
РаботаСПоследовательностями.СброситьСостояниеПоследовательностиДокумента(
МоментСледующегоДокумента.Ссылка,
МоментСледующегоДокумента.Дата,
Организация);
КонецЕсли;
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ТекстОшибки = ОписаниеОшибки();
ОписаниеОшибки = ИнформацияОбОшибке();
ОтменитьТранзакцию();
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
ЗаписьЖурналаРегистрации(НСтр("ru = 'Операция не выполнена'"), УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки.Описание);
ВызватьИсключение ТекстОшибки;
КонецПопытки;
Возврат МоментСледующегоДокумента;
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот