Еще раз о рабочих днях. Быстрый способ расчета в запросах

Публикация № 1070851 20.06.19

Разработка - Запросы

Рабочие дни запрос календарь график производственный добавить дате разность дат

В статье рассмотрен механизм учета производственных графиков и рабочих дней. Предложен простой и быстрый алгоритм решения типичных задач: добавление рабочих дней к дате и нахождение разницы между датами в рабочих днях. Все вычисления производятся исключительно запросом, т.е. решение пригодно для СКД и динамических списков.

Работа с производственными календарями, рабочими графиками часто встречается в практике разработки. Большинство задач можно свести к двум: 1) Добавить к дате (отнять от даты) некоторое количество рабочих дней и 2) найти разницу в рабочих днях между двумя датами. Несмотря на кажущуюся простоту, в этих задачах достаточно подводных камней, как методических, так и технологических. Естественно эта тема не была обойдена вниманием разработчиков типовых конфигураций и членов нашего сообщества. Простой поиск дает несколько результатов:

На мой взгляд, предлагаемые решения обладают теми или иными недостатками. В их числе:

  • сложность полученных запросов: применение временных таблиц, использование группировок больших таблиц, получаемых в результате соединения
  • не все решения хорошо работает с некоторыми входными данными, например в качестве входных параметров-дат могут быть использованы выходные дни
  • некоторые решения предполагают дополнительную обработку программным кодом промежуточных данных, полученных в результате запроса
  • часто решается узкая задача, т.е. решение не универсально.

Предлагаю свой вариант решения.

Постановка задачи:

Предположим, на предприятии ведется учет выполняемых работ. Каждая работа выполняется целое число дней, всегда начинается в начале дня, а заканчивается через несколько дней в конце дня. Продолжительность работ может быть от 1 дня, до нескольких лет (важность условия этого будет упомянута ниже). Необходимо иметь инструмент, позволяющий выполнять расчеты дат начала, окончания работ, продолжительностей работ, временных промежутков между работами. Все расчеты выполнять в рабочих днях. Решение должно позволять использование его в запросах.

В чем могут быть "подводные камни" при решении?  Например токарь работает по стандартному рабочему графику - пятидневке. 01 апреля 2019 он начинает изготавливать деталь №1, тратит на ее изготовление 5 дней, и начинает изготавливать следующую деталь №2. Когда он закончит изготовление детали №1? Когда начнет изготавливать деталь №2? Казалось бы в обоих случаях ответ: через 5 рабочих дней после 01 апреля, т.е. к 01.04.2019 надо прибавить 5 рабочих дней. Но в первом случае ответ - 05.04.2019, а во втором - 08.04.2019.

Решение:

Решение поставленной задачи неожиданно получилось довольно простым.

Предлагается следующее:

Для учета рабочих графиков (производственных календарей) используем вспомогательный регистр сведений:

РабочийГрафик - ссылка на справочник "РабочиеГрафики" - если на предприятии используется несколько графиков (пятидневка, пятидневка с праздниками, семидневка и т.п.)

Дата - дата графика (без времени)

ЭтоРабочийДень - флаг рабочий/нерабочий день

КолВоДнейСНачалаПериода - Число рабочих дней, прошедших до начала даты записи, начиная с определенной, наперед заданной даты. В моем примере используется 01.01.2000.

Регистр необходимо заполнить на весь период, в пределах которого будут производится расчеты.

Пример содержимого:

 

Теперь для нахождения разницы дат нам надо в регистре найти два числа, соответствующие этим датам и определить их разницу. Для добавления к дате некоторого числа рабочих дней, надо в регистре найти соответствующее дате число, добавить к нему число рабочих дней, и по результату найти в регистре соответствующую дату рабочего дня. Осталось учесть упомянутые выше сложности и получим следующее:

// Возвращает разность в днях между двумя датами (Дата2-Дата1) с учетом рабочего графика 
// Даты до полудня округляются вниз, после - вверх
// Параметры:
//  Дата1  - Дата -  Начальная дата
//  Дата2  - Дата -  Конечная дата
//  РабочийГрафик  - СправочникСсылка.РабочиеГрафики - Рабочий график
// Возвращаемое значение:
//  Число    - разность дат
Функция РазностьДат(Знач Дата1, Знач Дата2, Знач РабочийГрафик)Экспорт
	
	СекундВ12Часах = 12 * 60 * 60;
	Дата1 = НачалоДня(Дата1 + СекундВ12Часах);
	Дата2 = НачалоДня(Дата2 + СекундВ12Часах);
	
	Запр = Новый Запрос;
	Текст = "ВЫБРАТЬ
	        |	РабочиеДни2.КолВоДнейСНачалаПериода - РабочиеДни1.КолВоДнейСНачалаПериода КАК КолВоДней
	        |ИЗ
	        |	РегистрСведений.РабочиеДни КАК РабочиеДни1
	        |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РабочиеДни КАК РабочиеДни2
	        |		ПО (РабочиеДни2.РабочийГрафик = &РабочийГрафик)
	        |			И (РабочиеДни2.Дата = &Дата2)
	        |ГДЕ
	        |	РабочиеДни1.РабочийГрафик = &РабочийГрафик
	        |	И РабочиеДни1.Дата = &Дата1";
	Запр.Текст = Текст;
	Запр.УстановитьПараметр("Дата1", Дата1); 
	Запр.УстановитьПараметр("Дата2", Дата2); 
	Запр.УстановитьПараметр("РабочийГрафик", РабочийГрафик); 
	
	РезЗапроса = Запр.Выполнить();
	Если НЕ РезЗапроса.Пустой() Тогда   
		Выб = РезЗапроса.Выбрать(ОбходРезультатаЗапроса.Прямой);
		Выб.Следующий(); 		
		Результат = Выб.КолВоДней;			
	Иначе	
	КонецЕсли; 
	Возврат Результат;
КонецФункции // 


// Добавляет к дате заданное количество дней с учетом рабочего графика
// Параметры:
//  Дата  - Дата -  Дата.  Даты до полудня округляются вниз, после - вверх
//  КолВоДней  - Число - количество дней, любое целое
//  РабочийГрафик  - СправочникСсылка.РабочиеГрафики - РабочийГрафик
//  РезультатНачалоДня - Булево - Результат должен быть начало дня
// Возвращаемое значение:
//  Дата    -  Рассчитанная дата
Функция ДобавитьКДате(Знач Дата, Знач КолВоДней, Знач РабочийГрафик, РезультатНачалоДня) Экспорт
	
	СекундВ12Часах = 12 * 60 * 60;
	Дата = НачалоДня(Дата + СекундВ12Часах);
	Если РезультатНачалоДня = Ложь Тогда   
		КолВоДней = КолВоДней - 1;
	КонецЕсли; 
	Запр = Новый Запрос;
	Текст = "ВЫБРАТЬ
	|	РабочиеДни2.Дата КАК Дата
	|ИЗ
	|	РегистрСведений.РабочиеДни КАК РабочиеДни1
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РабочиеДни КАК РабочиеДни2
	|		ПО (РабочиеДни2.РабочийГрафик = &РабочийГрафик)
	|			И (РабочиеДни2.КолВоДнейСНачалаПериода = РабочиеДни1.КолВоДнейСНачалаПериода + &КолВоДней)
	|			И (РабочиеДни2.ЭтоРабочийДень)
	|ГДЕ
	|	РабочиеДни1.РабочийГрафик = &РабочийГрафик
	|	И РабочиеДни1.Дата = &Дата";
	Запр.Текст = Текст;
	Запр.УстановитьПараметр("Дата", Дата); 
	Запр.УстановитьПараметр("КолВоДней", КолВоДней); 
	Запр.УстановитьПараметр("РабочийГрафик", РабочийГрафик); 
	
	РезЗапроса = Запр.Выполнить();
	Если НЕ РезЗапроса.Пустой() Тогда   
		Выб = РезЗапроса.Выбрать(ОбходРезультатаЗапроса.Прямой);
		Выб.Следующий(); 		
		Результат = Выб.Дата;
		Если РезультатНачалоДня = Ложь Тогда   
			Результат = КонецДня(Результат);
		КонецЕсли; 
	КонецЕсли; 
	Возврат Результат;
КонецФункции // 

 

Примеры использования

// Когда завершится работа токаря №1?
ДобавитьКДате('20190401', 5, РабочийГрафик, Ложь);

// Когда токарь начнет работу №2 после завершения пятидневной работы №1?
ДобавитьКДате('20190401', 5, РабочийГрафик, Истина);

// Сколько фактически токарь делал работу - от начала до конца?
РазностьДат(НачалоДня(Дата1), КонецДня(Дата2), РабочийГрафик);

// Сколько рабочих дней токарь прогулял между окончанием работы №1 и началом работы №2?
РазностьДат(КонецДня(Дата1), НачалоДня(Дата2), РабочийГрафик);

// Сколько рабочих дней прошло от окончания работы №1 до сегодняшней вечерней планерки?
РазностьДат(КонецДня(Дата1), КонецДня(ТекущаяДата()), РабочийГрафик);

Как видим запросы получаются довольно простыми, не используются ни временные таблицы, ни группировки с агрегатными функциями, ни постобработка. Ничего не мешает производить расчет в запросе для нескольких записей. В прилагаемом файле реализован пример отчета по выполненным работам: дана дата начала, предполагаемая плановая продолжительность работы и фактическая дата завершения, определяется плановая дата завершения и отставание факта от плана.

Может возникнуть вопрос: оправдано ли с точки зрения производительности использование дополнительного регистра такой структуры, ведь при изменении флага рабочего/выходного дня надо пересчитывать все записи с большей датой? Я считаю, что вполне. Во-первых, изменение производственного календаря происходит обычно не чаще одного раза в месяц, а полный пересчет и сохранение набора записей за 100 лет(~40000 записей) по выбранному графику занимает считанные секунды. А во-вторых, выгода от использования быстрого массового расчета как правило с лихвой перекроет все время, потраченное на предварительную подготовку.

А что же БСП?

Опытный разработчик, использующий БСП, может сказать: "Так ведь в БСП реализовано почти что то же самое!". Да, действительно в БСП есть аналогичный регистр:

Есть также программный интерфейс модулей "ГрафикиРаботы", "КалендарныеГрафики" с функциями "РазностьДатПоКалендарю", "ДатыПоГрафику" и т.п. Но если присмотреться, то можно увидеть, что в регистре имеется измерение "Год". То есть в этом регистре отсчет количества дней идет с начала каждого года. Когда мы работаем с датами в пределах одного года, то подход при расчете совпадает с рассмотренным. Но если даты попадают в разные года, а особенно если рассматривается промежуток в несколько лет, то алгоритм получается весьма сложным. Все интересующиеся могут самостоятельно сравнить объем программного кода в библиотеке и в предложенном решении. Скорее всего, разработчики БСП стремились к упрощению процедуры заполнения - каждый год рабочего графика заполняется отдельно и не зависит от других. Но в результате мы получаем существенное усложнение алгоритмов при решении практических задач. Я бы рекомендовал использовать регистры БСП как источник для заполнения регистра "РабочиеДни", а все дальнейшие операции производить уже с ним.

UPD 25.06.2019:

Для конфигураций с БСП добавлено заполнение регистра на основе данных из типовых объектов - регистра КалендарныеГрафики и справочника Календари. В процессе обработки заполняется регистр за период с 2000 г. по примерно 2109 г. - 40000 дней.

 

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

Скачать файлы

Наименование Файл Версия Размер
Еще раз о рабочих днях. Быстрый способ расчета в запросах.:

.dt 316,74Kb
11
.dt 316,74Kb 11 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 20.06.19 13:42 Сейчас в теме
Решение поставленной задачи неожиданно получилось довольно простым.

и далее идет описание таблицы которую необходимо добавить конфигурацию для ...простоты.

Мне кажется, что не может быть простым решение для которого требуется добавлять в конфигурацию таблицу. Ведь эту таблицу необходимо обслуживать самостоятельно.
Abbra; Nelli_A86; soci0pat; vv2; boln; +5 Ответить
2. Alxby 944 20.06.19 15:39 Сейчас в теме
(1)В ваших словах есть доля истины - при обслуживании конфигураций, стоящих на поддержке, придется провести дополнительные работы. Если же абстрагироваться от типовых конфигураций и рассматривать разработку "с нуля", то решение действительно простое - один регистр и несложные алгоритмы расчета. Конечно же, каждый разработчик, принимая решение о внедрении в свою систему какого-либо механизма, должен соотнести трудозатраты с выгодой от такого внедрения. В статье я привел пример задачи, для которой, на мой взгляд, плюсы от его использования с лихвой перекрывают затраты на доработки. В приложенном файле есть пример заполнения регистра - дополнительной таблицы, эту функцию несложно доработать при встраивании в типовую конфигурацию.
3. Alxby 944 25.06.19 10:23 Сейчас в теме
Update: Добавлено заполнение информации на основе данных из типовых объектов БСП
4. valej 17.12.19 14:45 Сейчас в теме
Мне помогло в конфигурации ЗКГУ добавить рабочие дни к дате функция общего модуля. КалендарныеГрафики.ДатаПоКалендарю(Сюда график работы или ссылка на производственный календарь, Сюда дату отсчета, Сюда число рабочих дней сколько надо прибавить, Сюда Истину если ошибку выдавать на пустое значение графика)
user1346763; +1 Ответить
5. Alxby 944 17.12.19 16:56 Сейчас в теме
(4) Возможно ли в этой функции не добавить, а вычесть рабочие даты из заданной даты?
6. valej 17.12.19 20:37 Сейчас в теме
(5) Описание функции:
Возвращаемое значение: Дата, Неопределено - дата, увеличенная на количество дней, входящих в график.
7. blackhorse1976 19 03.03.20 17:09 Сейчас в теме
Запрос ниже делает Вашу таблицу на лету

ВЫБРАТЬ
	КалендарныеГрафики.Год КАК Год,
	МАКСИМУМ(КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода) КАК КоличествоДнейВГрафикеСНачалаГода
ПОМЕСТИТЬ ПредыдущиеГода
ИЗ
	РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики

СГРУППИРОВАТЬ ПО
	КалендарныеГрафики.Год
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	КалендарныеГрафики.Календарь КАК Календарь,
	КалендарныеГрафики.Год КАК Год,
	КалендарныеГрафики.ДатаГрафика КАК ДатаГрафика,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КалендарныеГрафики.ДеньВключенВГрафик) КАК ДеньВключенВГрафик,
	СУММА(КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода) + СУММА(ЕСТЬNULL(ПредыдущиеГода.КоличествоДнейВГрафикеСНачалаГода, 0)) КАК КоличествоДнейВГрафикеСНачалаГода
ИЗ
	РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики
		ЛЕВОЕ СОЕДИНЕНИЕ ПредыдущиеГода КАК ПредыдущиеГода
		ПО (КалендарныеГрафики.Год > ПредыдущиеГода.Год)

СГРУППИРОВАТЬ ПО
	КалендарныеГрафики.Календарь,
	КалендарныеГрафики.Год,
	КалендарныеГрафики.ДатаГрафика
Показать
8. Alxby 944 04.03.20 10:07 Сейчас в теме
(7)
Можно конечно обойтись без создания дополнительных метаданных в конфигурации и решать поставленные задачи исключительно запросом. Но цель публикации немного в другом - показать как достаточно простыми средствами обеспечить быстрый способ расчета. Ваш вариант требует а) чтение всего регистра календарных графиков, б) записи промежуточной временной таблицы, в) использование "СГРУППИРОВАТЬ" - достаточно тяжелая операция. Все это приводит к тому, что в ряде случаев он может не удовлетворять требованиям по быстродействию.
Я сейчас не могу потестировать запрос, но у меня вызывают некоторые сомнения строки:
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КалендарныеГрафики.ДеньВключенВГрафик) КАК ДеньВключенВГрафик,
и
СУММА(КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода) + СУММА(ЕСТЬNULL(ПредыдущиеГода.КоличествоДнейВГрафикеСНачалаГода, 0)) КАК КоличествоДнейВГрафикеСНачалаГода
для тех случаев, когда в ИБ заполнены графики за несколько лет.
9. blackhorse1976 19 05.03.20 07:46 Сейчас в теме
(8) В целом согласен, что по реальным записям будет быстрее - но если в ТИПОВОЙ конфиге этого нет - можно обойтись моим "костыликом"... :)

Согласен - строка
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КалендарныеГрафики.ДеньВключенВГрафик) КАК ДеньВключенВГрафик,
лишняя....

По второй части - даже если за один - то тогда первый запрос пустой и срабатывает EСЛИNULL
Номера пофигу от чего считать - он рождетва христова или от первого заполненного дня...
10. Alxby 944 05.03.20 15:43 Сейчас в теме
(9) Я имею в виду вот что:

Это результат работы запроса на моих данных.
Во-первых поле "ДеньВключенВГрафик" всегда равно 1,
во-вторых - данные в последней колонке должны быть неубывающими, а в результате запроса это не так.
11. blackhorse1976 19 06.03.20 08:46 Сейчас в теме
Я просто показывал концепцию - в реальном отчете этот запрос оказался уже доработанным до такого вида
ВЫБРАТЬ
	КалендарныеГрафики.Год КАК Год,
	МАКСИМУМ(КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода) КАК КоличествоДнейВГрафикеСНачалаГода,
	КалендарныеГрафики.Календарь КАК Календарь
ПОМЕСТИТЬ ПредыдущиеГода
ИЗ
	РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики

СГРУППИРОВАТЬ ПО
	КалендарныеГрафики.Год,
	КалендарныеГрафики.Календарь
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	КалендарныеГрафики.Календарь КАК Календарь,
	КалендарныеГрафики.Год КАК Год,
	КалендарныеГрафики.ДатаГрафика КАК ДатаГрафика,
	СУММА(КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода) + СУММА(ЕСТЬNULL(ПредыдущиеГода.КоличествоДнейВГрафикеСНачалаГода, 0)) КАК КоличествоДнейВГрафикеСНачалаГода
ПОМЕСТИТЬ ДатыПоГодам
ИЗ
	РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики
		ЛЕВОЕ СОЕДИНЕНИЕ ПредыдущиеГода КАК ПредыдущиеГода
		ПО КалендарныеГрафики.Год > ПредыдущиеГода.Год
			И КалендарныеГрафики.Календарь = ПредыдущиеГода.Календарь

СГРУППИРОВАТЬ ПО
	КалендарныеГрафики.Календарь,
	КалендарныеГрафики.Год,
	КалендарныеГрафики.ДатаГрафика
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДатыПоГодам.КоличествоДнейВГрафикеСНачалаГода КАК КоличествоДнейВГрафикеСНачалаГода,
	МИНИМУМ(ДатыПоГодам.ДатаГрафика) КАК ДатаГрафика,
	ДатыПоГодам.Календарь.ПроизводственныйКалендарь КАК Календарь
ПОМЕСТИТЬ ДатыПоРабочимДням
ИЗ
	ДатыПоГодам КАК ДатыПоГодам

СГРУППИРОВАТЬ ПО
	ДатыПоГодам.КоличествоДнейВГрафикеСНачалаГода,
	ДатыПоГодам.Календарь,
	ДатыПоГодам.Календарь.ПроизводственныйКалендарь
;
Показать
12. ILNIK 27 22.04.21 15:38 Сейчас в теме
Не до конца понял, как будет работать функция ДобавитьКДате().
Таблица1 соединяется с таблицей2, по номеру дня.
Но в случае, если полученная дата будет попадать на рабочие дни , а у них номер дня одинаковый с предыдущим рабочим днем, то запрос выведет несколько дат, нужно брать максимальную?
13. Alxby 944 22.04.21 18:53 Сейчас в теме
(12)У всех рабочих дней в регистре разный "номер дня", в запросе условие (РабочиеДни2.ЭтоРабочийДень), поэтому в результат попадет только один день.
14. ILNIK 27 22.04.21 22:23 Сейчас в теме
(13)я имел ввиду попадет на "нерабочий"
Например, мне нужно прибавить к понедельнику 4 рабочих дня

Номера дней.
Понедельник 1
Вторник 2
Среда 3
Четверг 4
Пятница 5
Суббота 6
Воскресенье 6
Понедельник 6

Мне запрос выведет три строки пятница 6, суббота 6 , воскресенье 6
Так?

Ps: понял, у вас там реквизит РабочиеДни2.ЭтоРабочийДень.
Я по-другому сделал немного

Ещё один кейс, если я у меня исходная дата, это нерабочий день, например заполнили в поле воскресенье, и нужно прибавить 6 рабочих дней.
Ваш запрос сработает?
15. Alxby 944 23.04.21 09:32 Сейчас в теме
(14) В Вашем примере запрос выдаст "Понедельник", так как это рабочий день.
Если исходная дата - нерабочий день, запрос также отработает корректно, т.е. результат будет одинаков для исходной даты в субботу, воскресение и утро понедельника.
16. fantik33323333 01.09.22 12:20 Сейчас в теме
....
дней = 12;
....
Запрос.Текст =  "ВЫБРАТЬ ПЕРВЫЕ  "+ Строка(Дней) +" 
	                |	ДанныеПроизводственногоКалендаря.Дата КАК Дата
	                |ПОМЕСТИТЬ ВТвыборкаДат
	                |ИЗ
	                |	РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
	                |ГДЕ
	                |	ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &ПроизводственныйКалендарь
	                |	И ДанныеПроизводственногоКалендаря.Дата >= &ДатаНачала
	                |	И ДанныеПроизводственногоКалендаря.ВидДня В(&ВидДня)
	                |
	                |УПОРЯДОЧИТЬ ПО
	                |	Дата
	                |;
Показать


в зависимости от сортировки - первая/последняя строка и будет искомая дата - рабочего или выходного дня от текущего.....
17. Alxby 944 01.09.22 16:18 Сейчас в теме
(16)Для большого количества дней ВТвыборкаДат будет избыточно большая, а нужна из нее только одна строка. И, к тому же, как с таким подходом получить из таблицы с колонками ДатаНачала, КолВоРабДней таблицу ДатаНачала, КолВоРабДней, ДатаОкончания?
18. fantik33323333 01.09.22 20:43 Сейчас в теме
поместить это ВТ , затем взять МАКСИМУМ()/Минимум() - минимум - дата начала - максимум - тот самый (например рабочий) день через

ЧислоДней
19. Alxby 944 02.09.22 10:08 Сейчас в теме
(18)Попробуйте, напишите и посмотрите что получиться. А потом оцените объем промежуточных таблиц и скорость выполнения запроса)
20. fantik33323333 15.09.22 16:05 Сейчас в теме
коллега, я как раз оценил ради вычисления рабочих дней идею добавления новых "сущностей" в конфигурацию....
21. Alxby 944 15.09.22 19:32 Сейчас в теме
(20) Я не спорю, возможно бывают ситуации, когда добавление новых объектов метаданных нерационально, а задачи из статьи встречаются редко. В моем случае часто встречается необходимость рассчитать разность дат для нескольких тысяч объектов, причем разница дат - несколько лет. Стандартными средствами красиво это не решается. Поверьте, на этом фоне трудозатраты на добавление новых объектов в конфигурацию - исчезающе малая величина.
Оставьте свое сообщение

См. также

[После] Новогодние задачи 2023

Математика и алгоритмы О жизни Бесплатно (free)

Не желаете ли очередную порцию интересных задач?

03.01.2023    1168    Alxby    18    

4

Если хочется низко-низкоуровневого программирования с битами и байтами

Математика и алгоритмы Платформа 1С v8.3 Абонемент ($m)

Все знают, что подавляющее большинство современных компьютеров работает в двоичном коде, т.е. оперирует всего двумя значениями - битами - "0" и "1". Потом из них складываются байты, слова, кило-, мега- и гигабайты etc. Но что происходит внутри процессора, как именно обрабатываются двоичные числа, например выполняются арифметические операции? Об этом — в публикации. Статья, я думаю, будет особенно интересна тем читателям, у которых во время обучения не было соответствующих курсов.

1 стартмани

01.12.2022    743    Alxby    16    

9

Перечень множественных значений в ячейке динамического списка. Как стало и как было

Механизмы платформы 1С Платформа 1С v8.3 План видов характеристик Абонемент ($m)

В платформе версии 8.3.21 наконец-то появилась возможность указать, что характеристика может содержать более одного значения, и правильно отобразить этот перечень в динамическом списке. Настройка нового механизма, а также альтернативы, используемые ранее, описаны в статье.

1 стартмани

20.09.2022    2895    Alxby    9    

45

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

Запросы Платформа 1С v8.3 Абонемент ($m)

Если Вам часто приходится просматривать в отладчике сложные пакетные запросы с большим количеством временных таблиц, то эта статья для Вас.

1 стартмани

27.08.2019    15956    ids79    23    

125

Проверка на наличие дублирующихся строк в табличных частях

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Рассмотрен вопрос осуществления проверки на наличие дублирующихся строк в табличных частях, предложен альтернативный вариант.

1 стартмани

04.04.2018    11664    RotaninV    2    

11

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

Создание мульти-базовых отчетов. Все, что вы хотели об этом знать

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

В статье описано создание отчета по данным из клиент-серверных баз кластера 1С. Подключение к базам осуществляется через com-соединение. В качестве примера создается отчет «Права доступа мульти-базовый», который оформлен в виде внешнего отчета с двумя вариантами выполнения. Для построения собственного отчета на базе описанного достаточно будет изменить функции «ПолучитьТекстЗапроса», в модуле объекта отчета и построить свой макет запроса. Также описан код вызова отчета путем нажатия кнопки с передачей параметров в макет запроса и форму отчета. Описание примера отчета показывает, что создание отчетов по нескольким базам данных в 1С, не является сверхсложной задачей и достигается простыми методами

1 стартмани

23.03.2018    11481    IVC_goal    3    

12

Запросы. Временные Таблицы. Сравнение методов создания ВТ

Запросы Платформа 1С v8.3 Абонемент ($m)

Любой начинающий программист 1с8 познает азы искусства языка 1С из книги "1С_ Предприятие 8.3. Практическое пособие разработчика. Примеры и типовые приемы" Радченко/Хрусталева http://v8.1c.ru/metod/books/book.jsp?id=441 В данном учебнике на стр.429 подробно рассмотрен пример создания сложного запроса с использованием Временных Таблиц. Сразу скажу, что как для новичка, - пример достаточно сложный и не совсем понятный к самостоятельному повторению в своих разработках. В данной статье мы подробно разберем этот пример сложного запроса Радченко/Хрусталевой и выполним ту же поставленную задачу, но гораздо проще и нагляднее с помощью моей простенькой консоли запросов https://infostart.ru/public/719293/ Я еще пару месяцев назад билась над алгоритмом создания Временных Таблиц в сложном запросе, поэтому нам пригодится и эта ссылка https://forum.infostart.ru/forum9/topic183700/

1 стартмани

09.02.2018    100260    jan-pechka    28    

30

Черпаем простые числа решетом Аткина

Математика и алгоритмы Запросы Платформа 1С v8.3 Абонемент ($m)

Предложен способ увеличения быстродействия запроса поиска простых чисел с помощью "решета Аткина".

1 стартмани

09.01.2018    9687    scientes    7    

8

Соединение таблиц в запросе по условию "В иерархии" с использованием Nested Sets

Запросы Платформа 1С v8.3 Россия Абонемент ($m)

Реализация метода хранения деревьев Nested Sets в 1С. Использование деревьев Nested Sets для соединения таблиц в запросах по условию "В иерархии".

1 стартмани

02.07.2017    21825    kron.isant    21    

37

Получение оборотов регистра в выбранной валюте

Запросы Платформа 1С v8.3 Абонемент ($m)

Недавно столкнулся с проблемой получения оборотов по регистру в выбранной валюте. С удивлением обнаружил, что эта задача не столь тривиальна. Простое "левое соединение" с Регистром сведений "КурсыВалют" не подходит, т. к. возможна ситуация, когда курсы валют не заполнены и надо найти последнее значение курса для каждого дня из периода. Вот мое решение:

1 стартмани

06.09.2013    13352    Tavalik    3    

3

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Запросы к регистрам сведений с реквизитом "ПериодЗавершения"

Запросы Платформа 1С v8.3 1С:Зарплата и Управление Персоналом 2.5 1С:Управление производственным предприятием Россия Управленческий учет Абонемент ($m)

В конфигурациях ЗУП и УПП есть 2 часто используемых регистра сведений: «РаботникиОрганизаций» aka «Кадровая история сотрудников (по юрлицам)» - хранит кадровые перемещения сотрудника в регл. учете и «ПлановыеНачисленияРаботниковОрганизаций» aka «Плановые начисления сотрудников организаций» - хранит назначенные сотруднику виды расчета. Эти регистры имеют одну особенность, часто упускаемую новичками из виду.

1 стартмани

28.08.2013    43279    Synoecium    9    

69

Уровни иерархии предков элементов справочника запросом

Запросы Платформа 1С v8.3 Абонемент ($m)

Предлагаю вниманию случай использования методики, описанной автором ildarovich [http://infostart.ru/profile/28527/] в статье [http://infostart.ru/public/160707/]. Одним пакетным запросом для каждого элемента справочника выводятся уровни всех его предков.

1 стартмани

25.07.2013    10169    zaxarovsky    3    

4

Как сделать простой парсер сложных запросов

Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Первым делом скажу, что опишу не столько парсер запросов, сколько анализатор круглых скобок (). В статье приводится код, адаптированный для управляемых форм.

1 стартмани

11.07.2013    8971    blockcode    8    

14

Выразить строку как число и строку как дату в запросе

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Приведены и прокомментированы запросы, помогающие решать указанные задачи в составе пакетных запросов. Отличием от других известных решений является простая структура, относительная компактность, высокие быстродействие и устойчивость к ошибкам исходных данных. Применяется техника искусственных таблиц, изначально упомянутая в статье "Порождающий запрос" [http://infostart.ru/public/90367/].

1 стартмани

24.01.2013    106885    ildarovich    58    

281

INFOSTART EVENT 2012: разбор решений конкурса разработчиков

Математика и алгоритмы Запросы Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

В статье проводится разбор присланных решений на конкурс разработчиков от компании "Первый БИТ". Приводятся планы выполнения запросов и сравниваются показатели быстродействия и оптимизации.

1 стартмани

25.12.2012    16018    krolya    49    

39

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

Новый запрос и новая таблица значений как функции

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Предлагается две простые функции, использование которых уменьшает объем кода в конфигурациях на платформе «1С:Предприятие 8». Эти функции можно добавлять к своему общему модулю, что сделает процесс программирования более эффективным.

1 стартмани

27.11.2012    48189    ildarovich    49    

165

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

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

В продолжение публикации «Транзитивное замыкание запросом» [http://infostart.ru/public/158512/] добавлены другие варианты использования того же приема. Приведены запросы для быстрого определения уровней всех элементов справочника, максимальной глубины справочника, прародителей произвольных элементов справочника, запрос для быстрого определения циклов (на примере справочника спецификаций «1С:Управление производственным предприятием») и определения множеств аналогов номенклатуры (также на примере конфигурации «1С:Управление производственным предприятием»).

1 стартмани

13.11.2012    129150    ildarovich    107    

436

Контроль выставленных счетов

Запросы Платформа 1С v8.3 1С:Бухгалтерия 2.0 Россия Бухгалтерский учет Абонемент ($m)

Контроль проведенных реализаций по данному счету

1 стартмани

02.11.2012    7446    krumenko    1    

1

Транзитивное замыкание запросом

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

В частности, показывается, как одним пакетным запросом найти ВСЕХ предков (потомков) в иерархическом справочнике. Аналогично можно определять входимость деталей в узлы и готовые изделия по их спецификациям, определять подмножества аналогичных запчастей по цепочке аналогов, решать другие подобные задачи. Приложен файл с примером отчета для замыкания иерархии произвольного справочника, позволяющий протестировать быстродействие запроса в разных условиях.

1 стартмани

29.10.2012    100771    ildarovich    122    

384

Запрос vs Объект + результат эксперимента, вполне реального

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Использование 1с-запроса для доступа к данным имеет преимущество в скорости перед объектной моделью при ожидаемом объеме выборки более 10 000 ссылок. Конкретный результат: 0.07 секунды при запросе против 0.0023 секунды при использовании объектной модели.

1 стартмани

25.10.2012    16746    tango    265    

30

Работа с 1С:Аналитика Промо

Онлайн-курс предусматривает изучение возможностей системы “1С:Аналитика”, которая работает как составная часть платформы “1С:Предприятие” и обеспечивает оперативный просмотр и анализ необходимых данных.

4500 рублей

Формирование отчетов по обязательному медицинскому страхованию на СКД. Написание запроса по ОМС. Вычисление кода региона субъекта РФ в запросе.

СКД Запросы Платформа 1С v8.3 1С:Зарплата и Управление Персоналом 2.5 Бухгалтерский учет Налоговый учет ФОМС, ЕФС Абонемент ($m)

В данной статье рассматриваются основные этапы построения запроса, который позволял бы формировать два вида отчета по ОМС: 1) отчет по принятым в организацию сотрудникам, подлежащим ОМС и 2) отчет по уволенным сотрудникам, подлежащим исключению из числа ОМС. Прилагаемый файл - настройка для типовой обработки "Консоль отчетов" типовой конфигурации "1С:ЗиУП."

1 стартмани

04.06.2010    15506    RailMen    14    

14

Вычисление стажа работы в организации запросом. Вычисление разности дат в годах, днях и месяцах запросом. Вычисление знака зодиака. Статистика окладов по знакам зодиака

Запросы Платформа 1С v8.3 1С:Зарплата и Управление Персоналом 2.5 Россия Абонемент ($m)

Задача: вывести в отчете «Списки сотрудников организаций» в поля «Лет», «Месяцев», «Дней», объединенных группой «Стаж в организации» разность между двумя датами в годах, месяцах и днях, используя компоновку данных, но не добавляя функции в общие модули (т.к. конфигурация на поддержке)

1 стартмани

18.05.2010    29960    RailMen    16    

54