Как определить дату последнего документа в 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! 15%

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

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

10000 руб.

02.09.2020    159409    872    399    

861

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

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

23.06.2024    7443    bayselonarrend    20    

154

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

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

11.12.2023    11222    dsdred    44    

130

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

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

11.10.2023    19319    skovpin_sa    15    

105

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

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

06.10.2023    23757    SeiOkami    48    

135

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

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

28.08.2023    14730    YA_418728146    7    

166

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    8375    sebekerga    55    

104

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

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

27.06.2023    25523    SeiOkami    31    

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