Установка границы последовательностей без перепроведения документов

1. Al_Capone 26.04.16 13:15 Сейчас в теме
Доброго времени суток!
Есть необходимость установить программно границу последовательностей без перепроведения документов за прошлый период.
Почитал СП, набросал код:

Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Справочники.Номенклатура.НайтиПоКоду("25"));
	
Последовательности.СписаниеТМЦ.УстановитьГраницу(Момент, Отбор);


Граница не меняется.
Платформа 8.2.19.90 Конфигурация "Мебельное производство" от ПартнерСофта

В чем может быть причина?

Заранее спасибо, а то уже весь интернет перерыл в поисках ответа.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Boneman 298 26.04.16 14:30 Сейчас в теме
(1) Al_Capone, вообще покопайся в типовых,
там целый общий модуль посвящен работами с последовательностями.

причем, они его существенно изменили.
Вот рабочая функция из старой бухни, причем в последних конфах ее выпилили.
Функция УстановитьПоследовательность(Организация, ДатаНачала, ДатаОкончания) Экспорт

    МоментСледующегоДокумента = Неопределено;
    
    // Для изменения состояний в последовательности блокируем последовательность
    // в целом по организации. 
    // Установка управляемой блокировки возможно только в рамках транзакции.
    // В случае возникновения ошибок отменяем транзакцию.
    
    НачатьТранзакцию();

    Попытка 

        РаботаСПоследовательностями.УстановитьБлокировкуПоследовательностиПоОрганизации(Организация);

        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр("Организация",     Организация);
        Запрос.УстановитьПараметр("ДатаНачала",     ДатаНачала);
        Запрос.УстановитьПараметр("ДатаОкончания",     ДатаОкончания);

        Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    ТаблицаПоследовательности.Регистратор
        |ИЗ
        |    Последовательность.ДокументыОрганизаций КАК ТаблицаПоследовательности
        |ГДЕ
        |    ТаблицаПоследовательности.Организация = &Организация
        |    И &УсловиеПериод
        |    И ТаблицаПоследовательности.СостояниеПроведения В (ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ПроведенСНарушениемПоследовательности), ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности))";
        
        ТекстУсловиеПериод = "";
        Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) Тогда
            ТекстУсловиеПериод = "ТаблицаПоследовательности.Период МЕЖДУ &ДатаНачала И &ДатаОкончания";
        ИначеЕсли ЗначениеЗаполнено(ДатаНачала) Тогда
            ТекстУсловиеПериод = "ТаблицаПоследовательности.Период >= &ДатаНачала";
        ИначеЕсли ЗначениеЗаполнено(ДатаОкончания) Тогда
            ТекстУсловиеПериод = "ТаблицаПоследовательности.Период <= &ДатаОкончания";
        КонецЕсли;
        
        Если ЗначениеЗаполнено(ТекстУсловиеПериод) Тогда
            Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеПериод", ТекстУсловиеПериод);
        Иначе
            Запрос.Текст = СтрЗаменить(Запрос.Текст, "И &УсловиеПериод", "");
        КонецЕсли;
        
        Выборка = Запрос.Выполнить().Выбрать();
        
        НаборЗаписей = Последовательности.ДокументыОрганизаций.СоздатьНаборЗаписей();
        
        Пока Выборка.Следующий() Цикл
        
            НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
            НаборЗаписей.Прочитать();
            
            ВГраница = НаборЗаписей.Количество() - 1;
            
            Для Сч = 0 По ВГраница Цикл
                // Удаляем с конца набора
                Движение = НаборЗаписей[ВГраница - Сч];
                
                // У документа могут быть записи последовательности по нескольким организациям,
                // если у него ранее меняли реквизит Организация, поэтому обрабатываем
                // только записи по текущей организации.
                Если Движение.Организация = Организация Тогда
                
                    Если Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности Тогда
                        НаборЗаписей.Удалить(Движение);
                    Иначе
                        Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ПроведенВПоследовательности;
                    КонецЕсли;
                
                КонецЕсли;
            
            КонецЦикла;
            
            НаборЗаписей.Записать();
        
        КонецЦикла;
        
        Если ЗначениеЗаполнено(ДатаОкончания) Тогда
        
            // Следующий по очереди документ объявляем проведенным с нарушением, 
            // чтобы с него начать потом перепроведение.
            МоментСледующегоДокумента = РаботаСПоследовательностями.МоментВремениПервогоДокументаВПоследовательности(Организация, ДатаОкончания + 1);
            
            Если МоментСледующегоДокумента <> Неопределено Тогда
            
                РаботаСПоследовательностями.СброситьСостояниеПоследовательностиДокумента(
                    МоментСледующегоДокумента.Ссылка, 
                    МоментСледующегоДокумента.Дата,
                    Организация);
                
            КонецЕсли;
        
        КонецЕсли;
        
        ЗафиксироватьТранзакцию();
    
    Исключение
    
        ТекстОшибки = ОписаниеОшибки();
        ОписаниеОшибки = ИнформацияОбОшибке();
    
        ОтменитьТранзакцию();
        
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
        ЗаписьЖурналаРегистрации(НСтр("ru = 'Операция не выполнена'"), УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки.Описание);
        ВызватьИсключение ТекстОшибки;
    
    КонецПопытки;
        
    Возврат МоментСледующегоДокумента;
    
КонецФункции
Показать
Al_Capone; +1 Ответить
19. vis_tmp 32 06.07.17 20:11 Сейчас в теме
(2)В БП 3.0.51.16 не работает на строчке:
"РаботаСПоследовательностями.УстановитьБлокировкуПоследовательностиПоОрганизации"
Наверное, что-то изменилось, не в курсе?
4. Martinian 10 26.04.16 15:36 Сейчас в теме
(1) Al_Capone, в качестве границы последовательности документов пытаетесь установить конкретный элемент справочника "Номенклатура"??? Сомнительно...
5. Al_Capone 26.04.16 16:27 Сейчас в теме
(4) Martinian, нужно указывать пустую ссылку?
6. Martinian 10 26.04.16 17:36 Сейчас в теме
(5) Al_Capone, вряд ли...
Что такое граница последовательности документов по сути? Момент времени, позиция конкретного документа.
7. Al_Capone 26.04.16 17:57 Сейчас в теме
(6) Martinian, это да, но что тогда нужно передавать в отбор, если у последовательности данные это номенклатура?
Мне вот с этим вообще не понятно.
3. Al_Capone 26.04.16 14:43 Сейчас в теме
8. Al_Capone 27.04.16 13:10 Сейчас в теме
Получилось добавить запись в последовательность, но при этом граница все равно не верная! Она актуальна на первую запись, при этом регистратор удален(обстоятельства не известны), и не только у этой записи(см. скриншот). Вопрос: как удалить все записи?
Прикрепленные файлы:
9. Obvious 27.04.16 13:27 Сейчас в теме
Даю свой пример.
Если ТипЗнч(ДатаДокумент) = Тип("Дата") Тогда
	МоментВремениДокумента = Новый МоментВремени(ДатаДокумент);
Иначе
	МоментВремениДокумента = Новый МоментВремени(ДатаДокумент.Дата, ДатаДокумент);
КонецЕсли;

Отбор = Новый Структура("Организация", Организация);

НачатьТранзакцию();

Последовательности[ИмяПоследовательности].УстановитьГраницу(МоментВремениДокумента, Отбор); 
	
Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
	                     |	Последовательность.Регистратор
	                     |ИЗ
	                     |	Последовательность."+ИмяПоследовательности+" КАК Последовательность
	                     |ГДЕ
	                     |	Последовательность.Период < &Дата
	                     |	И Последовательность.Организация = &Организация");
	Запрос.УстановитьПараметр("Дата", МоментВремениДокумента.Дата);					 
	Запрос.УстановитьПараметр("Организация", Организация);
	
	Результат = Запрос.Выполнить();
	Если НЕ Результат.Пустой() Тогда
		НаборЗаписей = Последовательности[ИмяПоследовательности].СоздатьНаборЗаписей();
		
		Выборка = Результат.Выбрать();
		Пока Выборка.Следующий() Цикл
			НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
			НаборЗаписей.Прочитать();
			НаборЗаписей.Записать();
		КонецЦикла;
	КонецЕсли;	
 
ЗафиксироватьТранзакцию();
Показать

Где:
ИмяПоследовательности - Имя вашей последовательности
ДатаДокумент - реквизит (тип либо дата либо документ)
Организация - реквизит Организация
Al_Capone; +1 Ответить
10. Al_Capone 27.04.16 13:45 Сейчас в теме
(9) Obvious, из Последовательности.ИмяПоследовательности я итак все записи удалил. Там было около полумиллиона записей. На скриншоте(см. выше) я выбириал записи из таблицы Последовательность.ИмяПоследовательности.Границы, там полторы тысячи записей, больше чем у половины регистратор это либо <Объект не найден> либо неопределено! Как эти записи почистить/исправить?
11. Martinian 10 27.04.16 15:04 Сейчас в теме
(10) Al_Capone, могу посоветовать сделать тестирование и исправление информационной базы (через Конфигуратор).
12. Al_Capone 27.04.16 15:31 Сейчас в теме
(11) Martinian, пробовал, проходит на ура, ошибок не находит.
13. Martinian 10 27.04.16 15:45 Сейчас в теме
(12) Al_Capone, выгрузить базу в файл .dt и обратно загрузить.
14. Al_Capone 27.04.16 16:19 Сейчас в теме
(13) Martinian, было испробованно одним из первых.
15. Martinian 10 27.04.16 19:30 Сейчас в теме
(14) Al_Capone, предысторию расскажите? Как базу до такого довели?
16. Al_Capone 28.04.16 09:16 Сейчас в теме
(15) Martinian, предыстория мне и самому интересна. Предположение такое: пытались автоматом перенести остатки из 7.7, видимо не очень получилось, потом делали ввод остатков вручную, а после некоторые документы удалялись непосредственно. Вот как-то так. А теперь это дело надо поправить.
17. Martinian 10 28.04.16 10:10 Сейчас в теме
(16) Al_Capone, тяжёлый случай... Всё сразу...
Разбираться надо...
18. Al_Capone 28.04.16 15:45 Сейчас в теме
Решение было принято следующее:
Удалить записи последовательности непосредственно из таблицы БД(внутренней).
Способов 2:
Для файлового варианта - Использовать Tool_1CD(альфа версия умеет удалять записи)
Для SQL - средствами sql.
Посмотреть названия таблиц можно с помощью ПолучитьСтруктуруХраненияБазыДанных(Массив).
Как пользоваться можно посмотреть в СП.
Если ни у кого предложений нет, вопрос можно считать закрытым.
Всем спасибо за помощь!
Aleksey3A; +1 Ответить
20. FetisovAN 17.08.17 14:35 Сейчас в теме
столкнулся с такой же проблемой, данной процедуры больше нет :(
21. fatman78 17 26.01.22 12:50 Сейчас в теме
(20)Можно использовать процедуру из комментария (9) Положить в общий модуль расширения и закомментировать 1 строку содержащую "УстановитьБлокировкуПоследовательностиПоОрганизации"

Если в конфигурации ведется одна организация, то можно просто очистить последовательность штатным способом
РаботаСПоследовательностями.ОчиститьПоследовательностьДокументыОрганизаций()


Еще одна важная деталь, про которую многие забывают, а она непосредственно влияет на начальную границу контроля последовательности - это "дата начала ведения учета", настраивается в учетной политике организации хранится в РегистрСведений.УчетнаяПолитика.Период. Очень часто возникают проблемы после свертки базы, т.к. записи регистра учетная политика за старые периоды остаются в базе после свертки. Это как правило вызывает ошибки учета 1С, когда программа 1С Бухгалтерия просит регламентное закрытие месяца в старых периодах, где учет не ведется.

Программно "дату начала ведения учета" можно получить функцией
РаботаСПоследовательностями.ДатаНеРанееНачалаУчета(Организация)



Функция проверена на БП 3.0.102.11 - в нее передаете ДатаОкончания. В результате с этой даты + первый документ свежее этой даты - это и будет начало периода перепроведения в закрытии месяца.
Функция УстановитьПоследовательность(Организация, ДатаНачала, ДатаОкончания) Экспорт

    МоментСледующегоДокумента = Неопределено;
    
    // Для изменения состояний в последовательности блокируем последовательность
    // в целом по организации. 
    // Установка управляемой блокировки возможно только в рамках транзакции.
    // В случае возникновения ошибок отменяем транзакцию.
    
    НачатьТранзакцию();

    Попытка 

//        РаботаСПоследовательностями.УстановитьБлокировкуПоследовательностиПоОрганизации(Организация);

        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр("Организация",     Организация);
        Запрос.УстановитьПараметр("ДатаНачала",     ДатаНачала);
        Запрос.УстановитьПараметр("ДатаОкончания",     ДатаОкончания);

        Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    ТаблицаПоследовательности.Регистратор
        |ИЗ
        |    Последовательность.ДокументыОрганизаций КАК ТаблицаПоследовательности
        |ГДЕ
        |    ТаблицаПоследовательности.Организация = &Организация
        |    И &УсловиеПериод
        |    И ТаблицаПоследовательности.СостояниеПроведения В (ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ПроведенСНарушениемПоследовательности), ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности))";
        
        ТекстУсловиеПериод = "";
        Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) Тогда
            ТекстУсловиеПериод = "ТаблицаПоследовательности.Период МЕЖДУ &ДатаНачала И &ДатаОкончания";
        ИначеЕсли ЗначениеЗаполнено(ДатаНачала) Тогда
            ТекстУсловиеПериод = "ТаблицаПоследовательности.Период >= &ДатаНачала";
        ИначеЕсли ЗначениеЗаполнено(ДатаОкончания) Тогда
            ТекстУсловиеПериод = "ТаблицаПоследовательности.Период <= &ДатаОкончания";
        КонецЕсли;
        
        Если ЗначениеЗаполнено(ТекстУсловиеПериод) Тогда
            Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеПериод", ТекстУсловиеПериод);
        Иначе
            Запрос.Текст = СтрЗаменить(Запрос.Текст, "И &УсловиеПериод", "");
        КонецЕсли;
        
        Выборка = Запрос.Выполнить().Выбрать();
        
        НаборЗаписей = Последовательности.ДокументыОрганизаций.СоздатьНаборЗаписей();
        
        Пока Выборка.Следующий() Цикл
        
            НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
            НаборЗаписей.Прочитать();
            
            ВГраница = НаборЗаписей.Количество() - 1;
            
            Для Сч = 0 По ВГраница Цикл
                // Удаляем с конца набора
                Движение = НаборЗаписей[ВГраница - Сч];
                
                // У документа могут быть записи последовательности по нескольким организациям,
                // если у него ранее меняли реквизит Организация, поэтому обрабатываем
                // только записи по текущей организации.
                Если Движение.Организация = Организация Тогда
                
                    Если Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности Тогда
                        НаборЗаписей.Удалить(Движение);
                    Иначе
                        Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ПроведенВПоследовательности;
                    КонецЕсли;
                
                КонецЕсли;
            
            КонецЦикла;
            
            НаборЗаписей.Записать();
        
        КонецЦикла;
        
        Если ЗначениеЗаполнено(ДатаОкончания) Тогда
        
            // Следующий по очереди документ объявляем проведенным с нарушением, 
            // чтобы с него начать потом перепроведение.
            МоментСледующегоДокумента = РаботаСПоследовательностями.МоментВремениПервогоДокументаВПоследовательности(Организация, ДатаОкончания + 1);
            
            Если МоментСледующегоДокумента <> Неопределено Тогда
            
                РаботаСПоследовательностями.СброситьСостояниеПоследовательностиДокумента(
                    МоментСледующегоДокумента.Ссылка, 
                    МоментСледующегоДокумента.Дата,
                    Организация);
                
            КонецЕсли;
        
        КонецЕсли;
        
        ЗафиксироватьТранзакцию();
    
    Исключение
    
        ТекстОшибки = ОписаниеОшибки();
        ОписаниеОшибки = ИнформацияОбОшибке();
    
        ОтменитьТранзакцию();
        
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
        ЗаписьЖурналаРегистрации(НСтр("ru = 'Операция не выполнена'"), УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки.Описание);
        ВызватьИсключение ТекстОшибки;
    
    КонецПопытки;
        
    Возврат МоментСледующегоДокумента;
    
КонецФункции
Показать
KValland; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот