Как определить дату последнего документа в 8ке.

02.10.08

Разработка - Механизмы платформы 1С

Решил записать в блог полезную мысль, чтобы не потерялась на форуме.
Вот тут //infostart.ru/forum/read.php?24,23382,23397#msg-23397 на форуме, спрашивали, как получить в восмерке дату последнего имеющегося в базе документа. В принципе тему можно расширить до вопроса "Как выбрать некоторое количество документов (возможно разного вида) по определенным критериям?".
Известно, что в восьмерке мы не можем выбирать все документы в одной выборке как в 7.7.
// Так не прокатит 
Док = СоздатьОбъект("Документ");
Док.ВыбратьДокументы();
Пока Док.ПолучитьДокумент()=1 Цикл
   // тут что  нибудь делаем
КонецЦикла;

Вместо этого теперь документы выбираются через объект ДокументМенеджер.<Имя документа>
Выборка = Документы.РасходнаяНакладная.Выбрать(ДатаНач, ДатаКон);
Пока Выборка.Следующий() Цикл
   // тут что  нибудь делаем
КонецЦикла;


При этом, имя документа необходимо указывать (читай - знать) перед вызовом метода Выбрать(). Следовательно, сначала необходимо все эти типы документов получить.
Чтобы в цикле получить все типы документов, можно воспользоваться коллекцией объектов Метаданные.Документы, и конкретным свойством Имя объекта коллекции, в котором храниться Вид документа, как он задан в конфигураторе. Немного подумав получаем примерно такой код:
            
	
ТекДата = '00010101'; //Переменная с пустой датой
	ЛастДок = Неопределено; //Здесь будет храниться документ с наибольшей датой
            //Перебираем все виды документов в метаданных
	Для каждого ТекДок из Метаданные.Документы Цикл
                        //имя текущего документа
		ТекИмя = ТекДок.Имя;
                        //Для создания выборки конкретного вида воспользуемся объектом
                        //ДокументМенеджер, для доспупа к конкретному виду используем 
                        //квадратные скобки и имя документа в них
		Выборка = Документы[ТекИмя].Выбрать(,,,"Дата Убыв");
                        // или Выборка = Документы[ТекИмя].Выбрать(ДатаНач,ДатаКон,Отбор,"Дата Убыв"); 
// Где Отбор это Структура, которая задает поле и значение отбора открываемой выборки. 
//Ключ структуры описывает имя поля, а значение структуры - 
//значение отбора по этому полю.

                        //Последним параметром мы поставили "Дата Убыв", то есть
                        //выбираться будут документы отсортированные по дате в порядке убывания, 
                        //самые большие даты - сначала
		Пока Выборка.Следующий() Цикл
                                    //В переменной ТекДата сохраняем наибольшую дату документа
			Если Выборка.Ссылка.Дата>ТекДата Тогда
                                                //в перенной ЛастДок - ссылку на документ с наибольшей датой
				ЛастДок = Выборка.Ссылка;
				ТекДата = ЛастДок.Дата;
			КонецЕсли;	
		        
			//При установленном порядке, первый документ в выборке
                                     // будет с напибольшей датой среди данного вида,
			//дальше можно не проверять
			Прервать;
		КонецЦикла;
	КонецЦикла;
	
	//Ну и собвтвенно выводим результаты
	Если ЛастДок <>Неопределено Тогда
		Сообщить(ЛастДок);
	Иначе
		Сообщить("Нет документов");
		
	КонецЕсли;


Второй способ получения информации о документах - язык запросов. Правда тут новички могут натолкнуться на те же самые грабли, потому что запросом можно выбрать только документа конкретного вида. Нет, к журналам документов тоже можно обращаться, но вот полного журнала, в котором регистрируются все документы по умолчанию, как в 7.7, нет, поэтому обращаться в запросе будем именно к конкретным документам. Как же будет выглядеть такой запрос? И не устанем ли мы перечислять в нем все документы?
Нет, не устанем, если будем формировать текст запроса автоматически по принципу описанному в первом примере.
Итак, как должен выглядеть текст запроса выбирающего документы одного вида? Примерно вот так:
"ВЫБРАТЬ
| ОприходованиеТоваров.Ссылка,
| ОприходованиеТоваров.ПометкаУдаления,
| ОприходованиеТоваров.Номер,
| ОприходованиеТоваров.Дата КАК Дата
|ИЗ
| Документ.ОприходованиеТоваров КАК ОприходованиеТоваров
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ"

Обратите внимание, документы сортируются в запросе по убыванию.

А запрос с несколькими видами документов?
Смотрим:
"ВЫБРАТЬ
| ОприходованиеТоваров.Ссылка,
| ОприходованиеТоваров.ПометкаУдаления,
| ОприходованиеТоваров.Номер,
| ОприходованиеТоваров.Дата КАК Дата
|ИЗ
| Документ.ОприходованиеТоваров КАК ОприходованиеТоваров
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| СписаниеТоваров.Ссылка,
| СписаниеТоваров.ПометкаУдаления,
| СписаниеТоваров.Номер,
| СписаниеТоваров.Дата
|ИЗ
| Документ.СписаниеТоваров КАК СписаниеТоваров
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ"


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


Сразу оговорюсь, что практически всю вышеописанныую процедуру (автоматического формирования текста запроса) я выдрал с типовой обработки "Универсальный журнал документов", которая использует нужный нам принцип:)
Итак, на что необходимо обратить внимание в этом коде:
- датами начала и конца запроса устанавливается пустая дата, это означает, что документы будут выбираться за весь период;
- документы отсортированы по убыванию;
- таблица результат запроса ограничена количеством строк равным ЕДИНИЦЕ - нам ведь нужем был только ОДИН последний документ;
- ну и кроме ссылки тут выбирается еще кое какая полезная информация: дата, номер, номер пиктограммы для отображения и т.д.
- вариант с запросом более правильный с методологической точки зрения.

Вот в принципе и все на сегодня, если кто то еще знает другие способы решения поставленной задачи - прошу в комменты:).

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122179    670    389    

714

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6410    dsdred    36    

112

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

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

11.10.2023    16187    skovpin_sa    14    

98

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18475    SeiOkami    46    

118

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8824    YA_418728146    6    

141

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15986    SeiOkami    31    

103

MS SQL Server: изучаем планы запросов

Запросы HighLoad оптимизация Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    16010    Филин    37    

113

Расширение глобального поиска 1С, или Глобальный поиск "на максималках"

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Мало кто знает, что поле "Глобального поиска" в 1С можно доработать. Добавить свои варианты поиска, кнопочки в результатах и даже целые пользовательские меню.

27.03.2023    6952    SeiOkami    10    

140
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. kitt 323 01.10.08 19:27 Сейчас в теме
Ну конечно, потом чувак на форуме уточнил, что ему надо дату только одного вида документа - Приходного кассового ордера, но, я со свойственной для русских широтой души быстро наклепал пару универсальных алгоритмов для всех документов:)
2. coder1cv8 3468 02.10.08 09:31 Сейчас в теме
Про выборку всех документов я уже писал здесь...
3. gutentag 253 15.10.08 17:03 Сейчас в теме
А не проще ли открыть журнал общих документов, переместить курсор в конц журнала и посмотреть дату последнего документа... Или я во что-то не въехал? :)
4. kitt 323 15.10.08 18:21 Сейчас в теме
gutentag здесь подразумевается "Программно". Интерективно конечно проще в журнале, но общий журнал в 8ке использует описанный в этой статье механизм с запросом.
Оставьте свое сообщение