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

Публикация № 331805

Разработка - Практика программирования

запрос преобразование в строку

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

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

Основной проблемой рассматриваемого преобразования в строку является выделение каждого конкретного разряда исходного числа. Например, число 123 состоит из трех разрядов. Пусть разряды нумеруются справа налево, начиная с нуля. Разряды отличаются весом: нулевой разряд в десятичной позиционной системе счисления имеет вес 1, первый – 10, второй – 100 и так далее. Для выделения каждого разряда требуется найти целое от деления числа на вес разряда, а затем – остаток от деления полученного целого на 10. Первый (второй слева) разряд, таким образом, получится так: 123 разделим на 10, получим 12,3. Затем возьмем целое, получим  12. Затем найдем остаток от деления на 10, получим 2 – искомый первый (второй слева) разряд. Буквальная запись этих выражений в запросе получается очень и очень громоздкой, но существует другой путь.

Этот путь заключается в использовании для нахождения остатка от деления пары функций: СЕКУНДА и ДОБАВИТЬКДАТЕ. Дело в том, что функция СЕКУНДА фактически является функцией остатка от деления на 60 числа секунд, прошедшего с начала времен. Чтобы превратить ее в функцию расчета остатка от деления на 10 достаточно считать секунды шестерками. То есть требуемая функция будет записываться так:

СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 6) ) / 6

Эта функция выделяет самый правый (нулевой) разряд числа Икс. Чтобы выделить первый разряд, нужно использовать функцию

СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 0.6) ) / 6

А чтобы выделить второй – функцию

СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 0.06) ) / 6

И так далее. Множитель 60 позволяет выделить разряд десятых долей, 600 – сотых и так далее.

Ограничением рассмотренного подхода является максимальное число секунд при работе с датами. Оно таково, что мы можем выделить не более 10-ти десятичных знаков в числе. Если число значащих знаков больше, исходное число потребуется предварительно разделить на две части «обычным» способом с использованием операции ВЫРАЗИТЬ КАК.

Приведем пример запроса для случая ЧИСЛО(10, 2)

ВЫБРАТЬ
	ПОДСТРОКА("0123456789", &Число / 10000000 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.000006)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.00006)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.0006)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.006)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.06)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.6)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 6)) / 6 + 1, 1)
	+ "." 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 60)) / 6 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 600)) / 6 + 1, 1) КАК Строка

Чтобы сделать запись чуть более короткой, две постоянные - цепочку цифр «0123456789» и начало времен можно вынести во вложенный запрос

ВЫБРАТЬ
	ПОДСТРОКА(Ц, &Число / 10000000 + 1, 1) 
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.000006)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.00006)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.0006)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.006)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.06)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.6)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 6)) / 6 + 1, 1)
	+ "." 
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 60)) / 6 + 1, 1) 
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 600)) / 6 + 1, 1) КАК Строка
ИЗ (ВЫБРАТЬ "0123456789" Ц, ДАТАВРЕМЯ(1, 1, 1) О) КАК Константы

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

ВЫБРАТЬ
	  ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 128)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 64)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 32)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 16)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 8)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 4)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 2)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30)) / 30 + 1, 1) КАК Строка

 

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

СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 30) ) = 0

можно использовать в запросе для проверки четности числа Икс.

Для перевода даты в строку достаточно перевести в строку по отдельности число дней, месяцев и лет исходной даты. В итоге получается следующий запрос

ВЫБРАТЬ
	ПОДСТРОКА("0123456789", ДЕНЬ(&Дата) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(&Дата))) / 6 + 1, 1) 
	+ "/" 
	+ ПОДСТРОКА("0123456789", МЕСЯЦ(&Дата) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МЕСЯЦ(&Дата))) / 6 + 1, 1) 
	+ "/" 
	+ ПОДСТРОКА("0123456789", ГОД(&Дата) / 1000 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.06)) / 6 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.6)) / 6 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 6)) / 6 + 1, 1) КАК Строка

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

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

Комментарии
Избранное Подписка Сортировка: Древо
1. spetzpozh 23.02.15 00:42 Сейчас в теме
Моя обычная реакция на публикации Маэстро - посмотрел, почесал репу, плюсанул и пошел дальше )))
Irwin; Kinestetik; Krio2; Famza; Cerberus1; denis_aka_wolf; Glebis; strange2007; acanta; manlak; ZLENKO; Somebody1; ZOMI; jif; magvay_k; DJDUH; xomaq; ice-net; 1cWin; kolessov_a; sstas007; sergio199; rpgshnik; Mails79; Anchoret; корум; veretennikoff; h00k; swimdog; flagma; NazarovV; orfos; hornet_X; Ananas_Zar; trumanl; MaxDavid; xCorsair; DrAku1a; _also; bds22; smit1c; Йожкин Кот; necropunk; lidersoft2; monkbest; Evil Beaver; slavap; Поручик; bulpi; Nuobu; Dmirily; DoctorRoza; iov; Tavalik; Uncore; pavlov_dv; w-divin; Makushimo; spezc; dj_serega; +60 Ответить
2. ololoanonim 3 23.02.15 11:20 Сейчас в теме
Выглядит весьма круто =)
rpgshnik; +1 Ответить
3. GROOVY 2523 23.02.15 13:41 Сейчас в теме
Фундаментально выглядит. Но нафига? Никогда не понимал, зачем это нужно.
Запрос оперирует данными, нужно красивое представление - для этого есть другие механизмы.
Ildar13; Gureev; ZeroSumGame; kadild; sanek050388; SP2000; nk25; tsmult; h00k; sergey512; monkbest; Nuobu; DoctorRoza; Dmitryiv; +14 4 Ответить
4. ildarovich 6883 23.02.15 15:53 Сейчас в теме
(3) GROOVY, вот небольшой перечень ссылок, который показывает, насколько часто встречается этот вопрос:
Преобразование строки в число/числа в строку в запросе
Как уже в запросе объединить число и строку?
Сложение строк в запросе
Дата в строку в запросе..
Как преобразовать дату в строку в запросе ?
v8: Операции преобразования Число в Строку и обратно в запросах
Вычисление строки в запросе.
Другие можно получит поиском "1С запрос дата число в строку"
Возможно, в половине случаев здесь действительно неправильно поставлена задача и лучше производить преобразование вне запроса.
Но, думаю, есть и случаи обоснованной необходимости таких преобразований.

Немного пофантазировав, можно привести такие примеры:
1) Проверить контрольные соотношения в разрядах ИНН, SSC, EAN (потребуется преобразование строки в число, выделение и сложение разрядов числа, расчет остатка);
2) Сформировать номера договоров, включающие даты;
3) Сформировать номера накладных, включающих даты;
4) Сформировать артикулы, включающие размер, вес или другие числовые характеристики товара;
5) Проверить набор признаков, закодированных в одном числе;
6) Найти пропущенные номера документов запросом;
7) Выделить (внести) вес из (в) штрих-кода весового товара.

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

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

Кроме того, здесь должен быть отдельно интересен прием компактной записи расчета остатка. Разложив 60 на множители, получим 2х2х3х5. Это значит, что через СЕКУНДА можно рассчитать остаток от деления на 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60. А через функцию ЧАС (24 = 2х2х2х3) еще на 8 и 24.
Kinestetik; monday14; Krio2; Gendelf; AliceLight; HitGroove; user1019590; rinik88; ZeroSumGame; Dementor; manlak; sm.artem; WizaXxX; Kabal; ViteG; rpgshnik; ABudnikov; sergio199; sss_russian; CratosX; iov; AlmazBur01; ugroblin; Dolly_EV; Оля_; BalyunovVV; Gesperid; +27 Ответить
51. ser6702 70 23.07.18 10:15 Сейчас в теме
(4) плюсую... как гимнастике ума не более. Инога этим сам страдаю. Но на самом деле вредная статья. Поясню:

Приведен перечень ссылок на вопросы, но вопросы эти ползут от ... непонимания - не так ли?
Сам на первых этапах при переходе от скуля и ора (с,паскаль) задавал сначала такие. На самом деле есть два мощных серврера СУБД и 1С, которые надо полномасштабно использовать. Не передавая на СУБД те задачи, которые ей не предназначены.

Пример:
В одной из конфигураций ( разработка внутренняя ) для ведения административно хозяйственной деятельности банка весь расчет амортизации ОС перенесли на запрос. А зачем спрашиваю? СУБД для 1С в основном служит для быстрого поиска... хранения данных и т.д. Все расширения типа pl/sql по сути реализованы в языке ... сервера приложений 1С. Кластер СУБД , им рулят его админы, и кластер 1С - оба мощные вычислительные комплексы. Сервер приложений 1С это тоже мощная машина с огромными ресурсами, которые надо использовать. Оптимизация состоит в том, чтобы с клиента один раз обратиться к серверу приложений 1С, с него за раз получить данные из субд и вернуть обратно через сервер приложений 1С на клиента. Опустил пока вопрос записи - объектная модель конечно по сравнению с табличной проигрывает, но зато взаимное поведение объектов относительно друг друга всегда предсказуемо.

Не надо кластер СУБД нагружать ему не предназначенными задачами - надо их верно перераспределять между кластерами СУБД и 1С.

Вы согласны с тем, что все эти переводы из строки туда обратно грамотно реализовать на сервере приложений 1С?
33. nk25 09.06.17 06:40 Сейчас в теме
(3) ну вот увлекается он этим :)
если бы в 1с-ком языке появился pl/sql с хранимыми процедурами то наверно все было по другому
41. sanek050388 16.10.17 13:01 Сейчас в теме
42. ildarovich 6883 16.10.17 14:27 Сейчас в теме
(41)
Сказали мне, что эта дорога меня приведёт к океану смерти,
И я с полпути повернула вспять.
С тех пор все тянутся предо мною кривые, глухие окольные тропы…
5. break 30 24.02.15 10:35 Сейчас в теме
а без значащихся нулей перед числами можно соорудить?
Maximysis; rpgshnik; +2 Ответить
6. ildarovich 6883 24.02.15 11:17 Сейчас в теме
(5) break, можно, если интерес не праздный. Приведите пример практической задачи - сделаю.
53. FilatovRA 149 15.10.18 18:32 Сейчас в теме
(6) Практический пример: Есть данные о неких внутренних идентификаторах номенклатуры, приведенных в справочнике с реквизитами "Номенклатура"(Справочник-номенклатура) и "Идентификатор"(Число).
Пример записи:
Маршрутизатор 12345678

Есть запись справочника "Номенклатура" введенная вручную, вида:

"Маршрутизатор 12345678 ПонятияНеИмеюЗачемЭтиЦифры".
Задача: заполнить некий регистр, хранящий записи о соответствиях этих 2х записей.
44. IVANTHESPACEBIKER 11.12.17 16:12 Сейчас в теме
(5)

ВЫБРАТЬ
	ВЫБОР
		КОГДА &Число / 10000000 > 1
			ТОГДА ПОДСТРОКА("0123456789", &Число / 10000000 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 1000000 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.000006)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 100000 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.00006)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 10000 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.0006)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 1000 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.006)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 100 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.06)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 10 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.6)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 1 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 6)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + "." + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 60)) / 6 + 1, 1) + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 600)) / 6 + 1, 1) КАК Строка
Показать
7. chmv 26.02.15 12:55 Сейчас в теме
А попроще. Может быть когда-нибудь и 1с это реализует
8. gaglo 27.02.15 09:58 Сейчас в теме
Большое спасибо за идею использования функции СЕКУНДА для получения остатка от деления. (Кажется мне, что простая проверка четности и другой кратности в запросе надобна чаще, чем перевод числа в строку.)
9. chmv 27.02.15 10:07 Сейчас в теме
8 Как раз Вы не правы, чаще перевод даты в строку
10. Поручик 4360 08.03.15 21:26 Сейчас в теме
На статьи автора у меня тоже реакция одна - почитал, плюс, порадовался, что есть люди с фундаментальным образованием. Сам бы ни за что не написал.
Kinestetik; xpess; POLGA; h00k; Evil Beaver; +5 Ответить
11. monkbest 104 17.03.15 11:04 Сейчас в теме
Я правильно понимаю, что строки полученные Вашим методом, потом можно складывать?

Потому что такой вот запрос вернет число как строку неограниченной длины
ВЫБРАТЬ
	ВзаиморасчетыССотрудниками.СуммаВзаиморасчетов,
	ПРЕДСТАВЛЕНИЕ(ВзаиморасчетыССотрудниками.СуммаВзаиморасчетов) КАК СуммаВзаиморасчетов1
ИЗ
	РегистрНакопления.ВзаиморасчетыССотрудниками КАК ВзаиморасчетыССотрудниками
ГДЕ
	ВзаиморасчетыССотрудниками.Сотрудник = &Сотрудник
12. ildarovich 6883 17.03.15 13:13 Сейчас в теме
(11) monkbest, да, можно складывать.
В вашем запросе "представление" это строка, которая формируется не в СУБД, а платформой в процессе постобработки запроса. Также как "итоги", например. Поэтому "представление" вы никак в самом запросе далее использовать не можете.
А строки, полученные в приведенных выражениях, можно использовать в запросе дальше. По ним можно группировать, соединять и прочее. Это обычное выражение языка запросов, хотя и несколько громоздкое.
13. sanfoto 497 23.03.15 07:04 Сейчас в теме
(12)
В вашем запросе "представление" это строка, которая формируется не в СУБД, а платформой в процессе постобработки запроса.


так то в принципе и 1С запросы - не чисто SQL запросы, а реляционно-подобные "объектные запросы к ВИРТУАЛЬНОЙ объектной модели"...
т.е. в процессе выполнения такого "объектного запроса" - генирится много дополнительного SQL кода для получения этих объектов..
К чему я это пишу - к тому что повальное увлечение переноса абсолютно всего кода в "1С запрос" - совсем не всегда оправдано на платформе "1С". На практике часто бывает быстрей отрабатывает(и пишется..) код с циклами с использованием 1С объектов "ТаблицаЗначений" и т.д.
14. ildarovich 6883 23.03.15 16:48 Сейчас в теме
(13) sanfoto, я противник крайностей. "Повальным увлечениям" стараюсь не поддаваться. Всегда нужно сравнивать время решения задачи запросом и кодом. Но, чтобы сравнивать решения, нужно их иметь. Вот тут и приведено возможное решение в запросе. Не чтобы безусловно использовать, а чтобы сравнить и выбрать. Таким образом у нас расширяется пространство возможностей, а уж выбор каждый делает сам в зависимости от конкретной задачи.
Kinestetik; Krio2; ser6702; Sapiens_bru; user747571; Designer1C; Kabal; fishca; mikele_bes; ABudnikov; premierex; realsevere; UniversaLL; sanfoto; +14 Ответить
15. alex_4x 81 25.08.15 13:01 Сейчас в теме
mszsuz; 02RUSlan; vvp117; bohdan-k; Krio2; snood; Valet; xpess; user774630; Gureev; user988634; purgin; FesenkoA; lunjio; Shurgent; manlak; 1cNike; Артано; evakuzmina; brr; Alex_grem; Kabal; DomenER; xomaq; Leoway; rabota.v8.1c; ice-net; the1; Yakud3a; NeLenin; sergio199; SergeyTerentyev; корум; IlyaSR; slawanix; AfroditaS; smaximaa; madonov; CratosX; NeviD; Cruciann; Winstoncuk; Nelli_A86; SavR11; sanfoto; Dementor; fvadim; Ali1976; hotey; Sergey_1c; ditp; tarassov; +52 Ответить
16. ildarovich 6883 26.08.15 13:08 Сейчас в теме
(15) alex_4x, картинку сами рисовали (редактировали) или взяли откуда?
17. alex_4x 81 26.08.15 13:34 Сейчас в теме
(16) Это Дилберт! Они очень наслышаны о нашей 1С :-)
18. Serj1C 478 13.01.16 13:18 Сейчас в теме
Связываться с датами для усечения дробной части? не накладно?
Может попробовать функцию Выразить(&Число-0.49 как Число(15,0)) ?
19. ildarovich 6883 13.01.16 14:46 Сейчас в теме
(18) Serj1C, в этом случае у меня получалось более громоздкое выражение. Поскольку для выделения одной цифры целое нужно было находить дважды. А по затратам времени, думаю, результаты должны быть примерно одинаковыми. То есть при примерно равных затратах времени выбираем меньшую громоздкость. Такое обоснование.
20. Sgeor 14.01.16 11:24 Сейчас в теме
Пригодился этот метод для таблиц из внешней БД.
Заметил один момент: в десятках выводились значения на единицу больше (например, вместо значения "10307" выводилось "10317").
Проблема решилась после того, как убрал "+1" из "/ 6 + 1" в вычислении десятков. Вот фрагмент:
ПО (customfieldvalue.STRINGVALUE = "10" 
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВЫРАЗИТЬ(customfieldoption.ID * 0.06 КАК ЧИСЛО(18, 0)))) / 6 + 1, 1) 
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВЫРАЗИТЬ(customfieldoption.ID * 0.6 КАК ЧИСЛО(18, 0)))) / 6, 1) 
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, customfieldoption.ID * 6)) / 6 + 1, 1))

Так что лучше перепроверить перед использованием этого метода.
Но мне все-равно очень пригодилось, спасибо.
21. ildarovich 6883 14.01.16 15:12 Сейчас в теме
(20) Sgeor, в тексте метода, приведенном в статье, никакого ВЫРАЗИТЬ нет. Этот оператор в этом случае не нужен, он лишний. То, что написано в (20) у меня совсем никак не работает.
Если же записать в точности так, как написано в статье:
ВЫБРАТЬ
	10307 КАК Id
ПОМЕСТИТЬ customfieldoption
;
ВЫБРАТЬ
	ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Id * 0.0006)) / 6 + 1, 1)
+ 	ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Id * 0.006)) / 6 + 1, 1)
+ 	ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Id * 0.06)) / 6 + 1, 1)
+ 	ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Id * 0.6)) / 6 + 1, 1)
+ 	ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Id * 6)) / 6 + 1, 1)
ИЗ
	customfieldoption КАК customfieldoption
Показать

то результат будет совершенно верный: "10307"
22. Sgeor 14.01.16 21:16 Сейчас в теме
(21) не при чем тут вообще "ВЫРАЗИТЬ" - это кусок давнишнего изврата и мракобесия=)
Тем не менее, я залез уже в консоль перепроверить и на сей раз вбил все чисто:
ВЫБРАТЬ
    customfieldoption.ID КАК До,
    "10" + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, customfieldoption.ID * 0.06)) / 6 + 1, 1)
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, customfieldoption.ID * 0.6 )) / 6 + 1, 1)
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, customfieldoption.ID * 6)) / 6 + 1, 1) КАК После
ИЗ
    ВнешнийИсточникДанных.JiraBasina.Таблица.customfieldoption КАК customfieldoption


Результат:
До----|--После
10300 | 10300
10301 | 10301
10302 | 10302
10303 | 10303
10304 | 10304
10305 | 10315
10306 | 10316
10307 | 10317
10308 | 10318
10309 | 10319

В итоге, если число в предыдущем разряде > 4, то прибавляется ненужная 1. Когда избавился от "+1" в вычислении десятков, все встало на свои места. Когда избавился от "+1" во всех разрядах, снова получил бред. А по твоему коду в (21) все в порядке. Магия.
Думается, что с ID-шниками в базе что-то странное? Нет - число как число.
23. ildarovich 6883 15.01.16 12:47 Сейчас в теме
(22) Sgeor, я, кажется, понял в чем дело. Есть правило определение точности результатов арифметических операций в запросе в зависимости от точности операндов. Они описаны в статье: Разрядность результатов выражений и агрегатных функций в языке запросов. Видимо, срабатывание этого правила приводит к необходимости привести результат customfieldoption.ID * 0.6 к целому типу! В результате производится не отбрасывание дробной части (как задумано в данном в статье выражении), а округление. Поэтому, видимо, нужно предварительно привести операнд к нужному типу, например, ВЫРАЗИТЬ(Id КАК Число(15, 1)).
Kabal; Sgeor; +2 Ответить
36. kasper076 49 15.06.17 14:05 Сейчас в теме
(35) В (23) Вы уже объясняли этот момент, но я не понял. В (35) гораздо понятнее. Мож еще кому понятнее будет. Спасибо.
24. selenat 01.02.16 12:02 Сейчас в теме
Добрый день. В базах на sql этот запрос нормально отрабатывает, а в базе на постгри - вылетает с ошибкой. Причем даже если делаю ПОДСТРОКА(""0123456789"", ВЫРАЗИТЬ(СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.06)) / 6 + 0.5 КАК ЧИСЛО(1, 0)), 1) (+0.5 использую, так как ВЫРАЗИТЬ округляет число, а не отбрасывает дробную часть)
как этому можно помочь?
25. ildarovich 6883 01.02.16 12:33 Сейчас в теме
(24) selenat, а платформа какая? Вообще с Postgre проблемы могут быть, буду разбираться, но быстро не обещаю.
26. selenat 01.02.16 13:33 Сейчас в теме
27. olbu 21.10.16 16:46 Сейчас в теме
Не могу сообразить, как имея таблицу дат в запросе и вот этот запрос
ВЫБРАТЬ
    ПОДСТРОКА("0123456789", ДЕНЬ(&Дата) / 10 + 1, 1) 
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(&Дата))) / 6 + 1, 1) 
    + "/" 
    + ПОДСТРОКА("0123456789", МЕСЯЦ(&Дата) / 10 + 1, 1) 
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МЕСЯЦ(&Дата))) / 6 + 1, 1) 
    + "/" 
    + ПОДСТРОКА("0123456789", ГОД(&Дата) / 1000 + 1, 1) 
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.06)) / 6 + 1, 1) 
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.6)) / 6 + 1, 1) 
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 6)) / 6 + 1, 1) КАК Строка
Показать


получить таблицу дат в строковом выражении?
28. ildarovich 6883 24.10.16 13:36 Сейчас в теме
(27) olbu, вам нужно написать запрос примерно такого вида:
ВЫБРАТЬ <СложноеВыражениеИзСтатьиГДЕПараметр&ДатаЗамененНаНужноеИмяПоляТаблицыДат> КАК ДатаВСтроковомВыражении ИЗ ТаблицаДатВЗапросе

Другими словами, в том поле, где требуется строковое представление даты, требуется записать сложное выражение из статьи, где вместо параметра &Дата указать имя поля таблицы, из которой выбираются даты.
29. user633312_i_vi 01.11.16 20:34 Сейчас в теме
ПОДСТРОКА("01020304050607080910111213141516171819202122232425262728293­031",ДЕНЬ(&Дата)*2-1,2)+"."
+ПОДСТРОКА("010203040506070809101112",МЕСЯЦ(&Дата)*2-1,2)+".201"
+ПОДСТРОКА("0123456789",ГОД(&Дата)-2010+1,1) КАК СтрДата
// Тоже не ахти но ...
DarkAn; jmi; +2 Ответить
30. ildarovich 6883 02.11.16 11:02 Сейчас в теме
(29) user633312_i_vi, хороший вариант. С месяцами вообще все хорошо, с годом - плохо.Дни - зависит от вкуса. Лично мне нравится. Возможно, стоит комбинировать в одном выражении оба этих подхода.
39. =Kollega= 1 10.10.17 09:47 Сейчас в теме
Расширив вариант (29) можно прийти к следующему:
ВЫБРАТЬ
	"00010203040506070809" + "10111213141516171819" + "20212223242526272829" + "30313233343536373839" + "40414243444546474849" + "50515253545556575859" + "60616263646566676869" + "70717273747576777879" + "80818283848586878889" + "90919293949596979899" КАК Ц
ПОМЕСТИТЬ Константа
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	0 КАК Число
ПОМЕСТИТЬ Числа_0_9

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	9

ИНДЕКСИРОВАТЬ ПО
	Число
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Старший.Число * 10 + Младший.Число КАК Число,
	ПОДСТРОКА(Константа.Ц, (Старший.Число * 10 + Младший.Число) * 2 + 1, 2) КАК Строка
ПОМЕСТИТЬ Числа_0_99
ИЗ
	Числа_0_9 КАК Младший,
	Числа_0_9 КАК Старший,
	Константа КАК Константа
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВЫБОР
		КОГДА Числа_0_99.Число < 50
			ТОГДА 2000 + Числа_0_99.Число
		ИНАЧЕ 1900 + Числа_0_99.Число
	КОНЕЦ КАК Год,
	ВЫБОР
		КОГДА Числа_0_99.Число < 50
			ТОГДА "20" + ПОДСТРОКА(Константа.Ц, Числа_0_99.Число * 2 + 1, 2)
		ИНАЧЕ "19" + ПОДСТРОКА(Константа.Ц, Числа_0_99.Число * 2 + 1, 2)
	КОНЕЦ КАК ГодСтрокой
ПОМЕСТИТЬ Годы
ИЗ
	Числа_0_99 КАК Числа_0_99,
	Константа КАК Константа
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Числа_0_99.Число КАК Число,
	Числа_0_99.Строка КАК Строка
ИЗ
	Числа_0_99 КАК Числа_0_99

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	Годы.Год,
	Годы.ГодСтрокой
ИЗ
	Годы КАК Годы

УПОРЯДОЧИТЬ ПО
	Число
Показать

Используя одну констатнту можно переводить годы в интервале 100 лет (в примере с 1950 по 2049), месяцы, дни, часы, минуты и секунды.
31. Amur_MVS 124 22.05.17 13:12 Сейчас в теме
32. rpgshnik 2005 09.06.17 04:32 Сейчас в теме
34. kasper076 49 15.06.17 12:30 Сейчас в теме
При разрядности числа 10 знаков, 3 после запятой
ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 6000)) / 6 + 1, 1)

выдает пустую строку.
Из-за того, что получается слишком большое число &Число * 6000.
Этот момент уже разбирался, но я не смог найти где.
35. ildarovich 6883 15.06.17 13:57 Сейчас в теме
(34) Конечно, у "добавить к дате" есть ограничения на величину параметров. И &Число * 6000 не может быть слишком большим. Можно проверить, ограничение порядка 2^32, то есть четырехбайтовое целое.

Это ограничение приведенного приема.

В этом случае предлагается выделять младшую и старшую часть числа и переводить их по отдельности.

СтаршаяЧасть = ВЫРАЗИТЬ(&Число / 10000000, КАК Число(15, 0));
МладшаяЧасть = &Число - СтаршаяЧасть * 10000000.

Об этом написано в самой статье
Ограничением рассмотренного подхода является максимальное число секунд при работе с датами. Оно таково, что мы можем выделить не более 10-ти десятичных знаков в числе. Если число значащих знаков больше, исходное число потребуется предварительно разделить на две части «обычным» способом с использованием операции ВЫРАЗИТЬ КАК.
rpgshnik; +1 Ответить
37. trumanl 11 09.10.17 16:48 Сейчас в теме
Добрый день,
если не ошибаюсь ЧИСЛО(8, 2) это 123456.78,
а не 12345678,90
предложение
Приведем пример запроса для случая ЧИСЛО(8, 2)
"" надо исправить на ЧИСЛО(10,2)
38. ildarovich 6883 09.10.17 17:22 Сейчас в теме
(37) Спасибо за уточнение, поправил.
40. puzakov 16.10.17 06:48 Сейчас в теме
Идея интересная, но... Не дай бог встретить подобное в промышленной БД *представил, перекрестился и плюнул три раза через плечо*
43. AlexanderKai 19.10.17 09:57 Сейчас в теме
Вот как приходится изголяться 1Сникам, только потому что 1С не включила поддержку CAST.
48. RotaninV 10 09.04.18 04:57 Сейчас в теме
(43) что самое интересное, на 8.0, до 2-3 релиза он был и вполне себе работал.
45. redfox64 7 22.03.18 12:26 Сейчас в теме
Интересно что в Postgre получаю неверный год. Вместо 2018 - 2028.
46. ildarovich 6883 22.03.18 13:27 Сейчас в теме
(45) А что получается, если просто
ВЫБРАТЬ Год(&Дата)
47. redfox64 7 22.03.18 16:38 Сейчас в теме
49. IvanVL 13 05.06.18 09:10 Сейчас в теме
Ага, дошло, долго понять не мог "что функция СЕКУНДА фактически является функцией остатка от деления на 60 числа секунд",
как понял, все стало понятно.
50. bajiepka 06.07.18 16:02 Сейчас в теме
Попробовал последний запрос на PostgreSql (linux). Как и писалось выше работает некорректно, видимо из-за округления или характерного для этой субд механизма получения дат. Это ни в коем случае не попытка "обхаить". Будьте бдительны с PostgreSQL.
52. taasha25 13 26.09.18 13:45 Сейчас в теме
Спасибо! Мне пригодилось.
54. starik-2005 2012 21.01.19 12:08 Сейчас в теме
А вот возник вопрос: а как теперь из получившейся строки убрать лидирующие нули? Мне, например, нужен диапазон какой-то, который я вычислил. В итоге он может быть от какого-нить нуля до какого-нить миллиона, но выводить "00000001-1000000" - как-то некошерно, однако. Есть мысли на эту тему? Первое, что приходит в голову - это поиск минимального "ненуля" и подстрока от позиции ненуля до конца строки. Остается придумать, как оптимально найти первый ненуль.
55. golod 01.02.19 13:16 Сейчас в теме
Спасибо автору поста, очень помогли
56. falexru 4 07.02.19 12:08 Сейчас в теме
ВЫБРАТЬ
ВЫБОР
КОГДА Не ПОДСТРОКА(&Номер, 1, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 1, 10)
КОГДА Не ПОДСТРОКА(&Номер, 2, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 2, 9)
КОГДА Не ПОДСТРОКА(&Номер, 3, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 3, 8)
КОГДА Не ПОДСТРОКА(&Номер, 4, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 4, 7)
КОГДА Не ПОДСТРОКА(&Номер, 5, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 5, 6)
КОГДА Не ПОДСТРОКА(&Номер, 6, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 6, 5)
КОГДА Не ПОДСТРОКА(&Номер, 7, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 7, 4)
КОГДА Не ПОДСТРОКА(&Номер, 8, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 8, 3)
КОГДА Не ПОДСТРОКА(&Номер, 9, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 9, 2)
Иначе ПОДСТРОКА(&Номер, 10, 1)
КОНЕЦ КАК СтрокаБезЛидирующихНулей
starik-2005; +1 Ответить
57. antonkms88 27.05.19 02:10 Сейчас в теме
Запрос 1С округляет по математическим правилам. Поэтому, представленный перевод из даты в строку не всегда отрабатывает корректно. Пример: 29.08.1995
Добавил немного, чтобы округления возвращали необходимые значения.
ПОДСТРОКА(«0123456789», ДЕНЬ(&Дата) / 10 + 0.5, 1),
ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(&Дата))) / 6 + 0.5, 1),
«/»,
ПОДСТРОКА(«0123456789», МЕСЯЦ(&Дата) / 10 + 0.5, 1),
ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МЕСЯЦ(&Дата))) / 6 + 0.5, 1),
«/»,
ПОДСТРОКА(«0123456789», ГОД(&Дата) / 1000 + 0.5, 1),
ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.06 — 0.5)) / 6 + 0.5, 1),
ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.6 — 0.5)) / 6 + 0.5, 1),
ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 6 — 0.5)) / 6 + 0.5, 1)
60. ildarovich 6883 29.08.19 14:59 Сейчас в теме
(57) Не могу подтвердить.
У меня, наоборот, мой код из статьи дает на примере 29.08.1995 совершенно верный результат, а ваш код дает 28/07/1984 на этих данных.
Нужно разобраться. Принцип округления при составлении запроса учитывался. И запрос тестировался. Правда, не на Постгри.
63. antonkms88 30.08.19 15:22 Сейчас в теме
(60)
Да, от СУБД, судя по всему, зависит.
В приложении 2 картинки. Одна картинка - серверная база с СУБД Postg, другая картинка - файловая база.
Результаты полностью противоположные.
Прикрепленные файлы:
58. OksDallas 22 11.06.19 07:33 Сейчас в теме
Внесу свои пять копеек по преобразованию даты в строку
Запрос = Новый Запрос;

Запрос.Текст = 
"ВЫБРАТЬ
|	ОтзывыИзОтпуска.Сотрудник КАК Сотрудник,
|	ОтзывыИзОтпуска.ПриказОбОтзыве,
|	ДЕНЬ(ОтзывыИзОтпуска.Период) КАК День,
|	МЕСЯЦ(ОтзывыИзОтпуска.Период) КАК Месяц,
|	ГОД(ОтзывыИзОтпуска.Период) - 2000 КАК Год
|ПОМЕСТИТЬ ВТ_ОтпускСОтзывами
|ИЗ
|	РегистрСведений.ОтзывыИзОтпуска КАК ОтзывыИзОтпуска
|ГДЕ
|	ОтзывыИзОтпуска.Сотрудник В(&Сотрудник)
|
|ИНДЕКСИРОВАТЬ ПО
|	Сотрудник
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВТ_ОтпускСОтзывами.Сотрудник,
|	""Пр.№ "" + ВТ_ОтпускСОтзывами.ПриказОбОтзыве + "" от "" + ВЫБОР
|		КОГДА ВТ_ОтпускСОтзывами.День < 10
|			ТОГДА ""0"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.День + 1, 1)
|		КОГДА ВТ_ОтпускСОтзывами.День < 20
|			ТОГДА ""1"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.День - 9, 1)
|		КОГДА ВТ_ОтпускСОтзывами.День < 30
|			ТОГДА ""2"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.День - 19, 1)
|		ИНАЧЕ ""3"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.День - 29, 1)
|	КОНЕЦ + ""."" + ВЫБОР
|		КОГДА ВТ_ОтпускСОтзывами.Месяц < 10
|			ТОГДА ""0"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Месяц + 1, 1)
|		ИНАЧЕ ""1"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Месяц - 9, 1)
|	КОНЕЦ + "".20"" + ВЫБОР
|		КОГДА ВТ_ОтпускСОтзывами.Год < 10
|			ТОГДА ""0"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Год + 1, 1)
|		КОГДА ВТ_ОтпускСОтзывами.Год < 20
|			ТОГДА ""1"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Год - 9, 1)
|		КОГДА ВТ_ОтпускСОтзывами.Год < 30
|			ТОГДА ""2"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Год - 19, 1)
|		КОГДА ВТ_ОтпускСОтзывами.Год < 40
|			ТОГДА ""3"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Год - 29, 1)
|		КОГДА ВТ_ОтпускСОтзывами.Год < 50
|			ТОГДА ""4"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Год - 39, 1)
|		ИНАЧЕ ""5"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.День - 49, 1)
|	КОНЕЦ + "" г."" КАК Приказ
|ИЗ
|	ВТ_ОтпускСОтзывами КАК ВТ_ОтпускСОтзывами";

Запрос.УстановитьПараметр("Циферки", "0123456789");
Показать
acanta; jura_b; ildarovich; +3 Ответить
59. YalanchidiO 20 28.08.19 14:04 Сейчас в теме
Передо мной стояла задача вывести время двух документов через "-". Должно было получиться, например, "15:08 - 16:05". Выводить необходимо было данные в динамический список, поэтому делать нужно было вычисление этого выражения в запросе. Спасибо большое за идею, но столкнулась с тем, что число в запросе в любом случае округляется по арифметическим правилам, то есть 1,8 = 2 , как ни крути)

Возможно, мой код оказался громоздким, но он работает)

ВЫБОР
	КОГДА ЧАС(ЗаказКлиента.Дата) <= 4
		ТОГДА ПОДСТРОКА("0123456789", ЧАС(ЗаказКлиента.Дата) / 10 + 1, 1)
	ИНАЧЕ ВЫБОР
			КОГДА ЧАС(ЗаказКлиента.Дата) <= 9
				ТОГДА ПОДСТРОКА("0123456789", ЧАС(ЗаказКлиента.Дата) / 10, 1)
			ИНАЧЕ ВЫБОР
					КОГДА ЧАС(ЗаказКлиента.Дата) <= 14
						ТОГДА ПОДСТРОКА("0123456789", ЧАС(ЗаказКлиента.Дата) / 10 + 1, 1)
					ИНАЧЕ ВЫБОР
							КОГДА ЧАС(ЗаказКлиента.Дата) <= 19
								ТОГДА ПОДСТРОКА("0123456789", ЧАС(ЗаказКлиента.Дата) / 10, 1)
							ИНАЧЕ ВЫБОР
									КОГДА ЧАС(ЗаказКлиента.Дата) <= 24
										ТОГДА ПОДСТРОКА("0123456789", ЧАС(ЗаказКлиента.Дата) / 10 + 1, 1)
								КОНЕЦ
						КОНЕЦ
				КОНЕЦ
		КОНЕЦ
КОНЕЦ + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ЧАС(ЗаказКлиента.Дата))) / 6 + 1, 1) + ":" + ВЫБОР
	КОГДА МИНУТА(ЗаказКлиента.Дата) <= 4
		ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
	ИНАЧЕ ВЫБОР
			КОГДА МИНУТА(ЗаказКлиента.Дата) <= 9
				ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
			ИНАЧЕ ВЫБОР
					КОГДА МИНУТА(ЗаказКлиента.Дата) <= 14
						ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
					ИНАЧЕ ВЫБОР
							КОГДА МИНУТА(ЗаказКлиента.Дата) <= 19
								ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
							ИНАЧЕ ВЫБОР
									КОГДА МИНУТА(ЗаказКлиента.Дата) <= 24
										ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
									ИНАЧЕ ВЫБОР
											КОГДА МИНУТА(ЗаказКлиента.Дата) <= 29
												ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
											ИНАЧЕ ВЫБОР
													КОГДА МИНУТА(ЗаказКлиента.Дата) <= 34
														ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
													ИНАЧЕ ВЫБОР
															КОГДА МИНУТА(ЗаказКлиента.Дата) <= 39
																ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
															ИНАЧЕ ВЫБОР
																	КОГДА МИНУТА(ЗаказКлиента.Дата) <= 44
																		ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
																	ИНАЧЕ ВЫБОР
																			КОГДА МИНУТА(ЗаказКлиента.Дата) <= 49
																				ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
																			ИНАЧЕ ВЫБОР
																					КОГДА МИНУТА(ЗаказКлиента.Дата) <= 54
																						ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
																					ИНАЧЕ ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
																				КОНЕЦ
																		КОНЕЦ
																КОНЕЦ
														КОНЕЦ
												КОНЕЦ
										КОНЕЦ
								КОНЕЦ
						КОНЕЦ
				КОНЕЦ
		КОНЕЦ
КОНЕЦ + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МИНУТА(ЗаказКлиента.Дата))) / 6 + 1, 1) + " - " + ВЫБОР
	КОГДА ЧАС(ВложенныйЗапрос2.Дата) <= 4
		ТОГДА ПОДСТРОКА("0123456789", ЧАС(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
	ИНАЧЕ ВЫБОР
			КОГДА ЧАС(ВложенныйЗапрос2.Дата) <= 9
				ТОГДА ПОДСТРОКА("0123456789", ЧАС(ВложенныйЗапрос2.Дата) / 10, 1)
			ИНАЧЕ ВЫБОР
					КОГДА ЧАС(ВложенныйЗапрос2.Дата) <= 14
						ТОГДА ПОДСТРОКА("0123456789", ЧАС(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
					ИНАЧЕ ВЫБОР
							КОГДА ЧАС(ВложенныйЗапрос2.Дата) <= 19
								ТОГДА ПОДСТРОКА("0123456789", ЧАС(ВложенныйЗапрос2.Дата) / 10, 1)
							ИНАЧЕ ВЫБОР
									КОГДА ЧАС(ВложенныйЗапрос2.Дата) <= 24
										ТОГДА ПОДСТРОКА("0123456789", ЧАС(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
								КОНЕЦ
						КОНЕЦ
				КОНЕЦ
		КОНЕЦ
КОНЕЦ + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ЧАС(ВложенныйЗапрос2.Дата))) / 6 + 1, 1) + ":" + ВЫБОР
	КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 4
		ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
	ИНАЧЕ ВЫБОР
			КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 9
				ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
			ИНАЧЕ ВЫБОР
					КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 14
						ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
					ИНАЧЕ ВЫБОР
							КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 19
								ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
							ИНАЧЕ ВЫБОР
									КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 24
										ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
									ИНАЧЕ ВЫБОР
											КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 29
												ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
											ИНАЧЕ ВЫБОР
													КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 34
														ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
													ИНАЧЕ ВЫБОР
															КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 39
																ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
															ИНАЧЕ ВЫБОР
																	КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 44
																		ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
																	ИНАЧЕ ВЫБОР
																			КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 49
																				ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
																			ИНАЧЕ ВЫБОР
																					КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 54
																						ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
																					ИНАЧЕ ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
																				КОНЕЦ
																		КОНЕЦ
																КОНЕЦ
														КОНЕЦ
												КОНЕЦ
										КОНЕЦ
								КОНЕЦ
						КОНЕЦ
				КОНЕЦ
		КОНЕЦ
КОНЕЦ + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МИНУТА(ВложенныйЗапрос2.Дата))) / 6 + 1, 1)
Показать
Прикрепленные файлы:
61. ildarovich 6883 29.08.19 15:05 Сейчас в теме
(59) Хочу разобраться: чем не устроил запрос из статьи? Способ округления я учитывал, когда составлял запрос и тестировал подход, но все может быть...
Какая у вас СУБД? Давайте я протестирую свой подход на ваших данных (нужно немного времени). Вообще я против такой громоздкости, даже если она работает.
62. ildarovich 6883 29.08.19 15:59 Сейчас в теме
(59) + (61) Вот запрос с вашими данными
ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 13, 44, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 14, 44, 0) КАК Дата2 ПОМЕСТИТЬ ВТ
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 11, 46, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 13, 47, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 11, 20, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 11, 21, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 09, 25, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 11, 57, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 09, 23, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 10, 53, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 09, 23, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 10, 53, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 18, 09, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 18, 13, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 09, 23, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 10, 53, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 15, 59, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 16, 29, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 15, 51, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 15, 58, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 15, 59, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 16, 29, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 15, 00, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 15, 37, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 14, 44, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 14, 59, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 14, 36, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 14, 42, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 14, 21, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 16, 53, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 13, 40, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 13, 41, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 13, 18, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 13, 42, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 11, 53, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 13, 01, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 11, 07, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 11, 31, 0) КАК Дата2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПОДСТРОКА("0123456789", ЧАС(ВТ.Дата1) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ЧАС(ВТ.Дата1))) / 6 + 1, 1) 
	+ ":" + ПОДСТРОКА("0123456789", МИНУТА(ВТ.Дата1) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МИНУТА(ВТ.Дата1))) / 6 + 1, 1) 
	+ "-" 
	+ ПОДСТРОКА("0123456789", ЧАС(ВТ.Дата2) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ЧАС(ВТ.Дата2))) / 6 + 1, 1) 
	+ ":" + ПОДСТРОКА("0123456789", МИНУТА(ВТ.Дата2) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МИНУТА(ВТ.Дата2))) / 6 + 1, 1) КАК Строка
ИЗ
	ВТ КАК ВТ
Показать
Прикрепленные файлы:
64. Aleks9111 29.10.19 19:26 Сейчас в теме
Публикация скоро 5-и летний юбилей будет праздновать.. а мы до сих пор обкладываемся костылями чтобы преобразовать число или дату в строку. Отстаем, лет на 20
65. _Sedoy 25.11.19 17:19 Сейчас в теме
Может я что-то не понимаю, но...
Функция ПРЕДСТАВЛЕНИЕ
Данная функция предназначена для получения строкового представления значения произвольного типа.

Параметр функции – выражение любого типа.

Возвращаемое значение – представление значения, тип СТРОКА.

Результат работы функции не может быть использован внутри других функций, за исключением функции ПРЕДСТАВЛЕНИЕ.

Пример:
ВЫБРАТЬ
   ПРЕДСТАВЛЕНИЕ(РасхНакл.Получатель) КАК ПолучательСтрокой,
   ПРЕДСТАВЛЕНИЕ(РасхНакл.Дата) КАК ДатаСтрокой
ИЗ
   Документ.РасхНакл КАК РасхНакл
66. PolSerg 11.02.20 12:03 Сейчас в теме
Промучавшись с этим решением понял что проблемы математического округления возникают при делении получившегося числа на 6, вот код который верно отрабатывает:

ВЫБРАТЬ
    ПОДСТРОКА(Ц, &Число / 10000000 + 1, 1) 
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.000006)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.00006)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.0006)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.006)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.06)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.6)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 6)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + "." 
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 60)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 600)) / 6-0.4999999999 + 1 как число(1,0)), 1)
ИЗ (ВЫБРАТЬ "0123456789" Ц, ДАТАВРЕМЯ(1, 1, 1) О) КАК Константы
Показать
Оставьте свое сообщение

См. также

Программная работа с настройками СКД

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    5228    ids79    25       

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

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

[СКД] Программное создание схемы компоновки данных

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    7213    John_d    21       

INFOSTART MEETUP Kazan. 13 марта 2020 г. Промо

Инфостарт продолжает путешествие по России. Следующая остановка - Казань. Тема мероприятия - управление и технологии автоматизации учета на платформе "1С: Предприятие". Ждем всех: докладчиков и участников! Стоимость участия - 5 500 рублей. Цена действительна до 30.01.2020

5 500

Агрегатные функции СКД, о которых мало кто знает

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    23855    ids79    45       

Управление ИТ-проектами. Модуль 2: продвинутый онлайн-курс по классическим методам управления проектами. Вебинары проходят с 12 марта по 11 июня 2020 года. Промо

Продвинутый онлайн-курс по классическому управлению ИТ-проектами позволит слушателям освоить инструменты из PMBoK® и 1С:Технологии корпоративного внедрения и научиться их применять для проектов любого масштаба. Курс включает в себя 12 вебинаров и 12 видеолекции, разбор кейсов и рекомендации экспертов по проектам слушателей. Ведущая курса - Мария Темчина.

от 13000 рублей

Три костыля. Сказ про фокусы в коде

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

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

03.09.2019    15371    YPermitin    75       

Базовый курс по управлению ИТ-проектами. Курс проходит с 26 февраля по 22 апреля 2020 года. Промо

Отличительная черта курса - органичное сочетание трех вещей: 1.Теория проектного управления (PMI®+Agile Alliance+Российские ГОСТ+Методологии от 1С); 2. Опыт внедрения продуктов 1С (опыт франчайзи и успешных компаний + тренды Infostart Event и Agile Days); 3. Разбор реальных проблем и рекомендации экспертов по проектам слушателей. Мы будем фиксироваться на тех инструментах, которые реально оказываются полезными в практике руководителей проектов внедрения. Ведущая курса - Мария Темчина.

от 11000 рублей

Отслеживание выполнения фонового задания

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции Разработка

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    18135    ids79    16       

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    32857    ids79    36       

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Фоновое выполнение кода в 1С - это просто

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

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

02.08.2019    18213    avalakh    21       

Новый раздел на Инфостарте - Electronic Software Distribution Промо

Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.

  • Низкие цены, без скрытых платежей и наценок
  • Оперативная отгрузка
  • Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
  • Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    26861    ids79    9       

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    19449    ids79    27       

Онлайн-курс "Подготовка к экзамену 1С:Эксперт и 1С:Профессионал по технологическим вопросам" с 7 по 24 апреля 2020 г. Промо

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

16450 рублей

Регистры сведений. За кулисами

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    14734    YPermitin    12       

"Меньше копипаста!", или как Вася универсальную процедуру писал

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    12021    SeiOkami    49       

Базовый курс по обмену данными в системе 1С:Предприятие. Онлайн-интенсив с 12 по 28 мая 2020 г. Промо

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

5500 рублей

Создание отчетов с помощью СКД - основные понятия и элементы

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    31524    ids79    17       

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Разработка

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    16836    dmurk    144       

Сдача регламентированной отчетности из программ 1С Промо

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

от 1500 руб.

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

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    27066    YPermitin    27       

Выполнение внешней обработки в фоновом задании

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    17172    Eret1k    23       

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

Выгрузка документа по условию

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    9251    m-rv    2       

Как прикрутить ГУИД к регистру сведений

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

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

16.04.2019    12372    m-rv    16       

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

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

О расширениях замолвите слово...

Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования Разработка

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    23276    ellavs    125       

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    18464    ellavs    83       

Голосование за доклады на INFOSTART MEETUP Kazan - до 25 февраля. Промо

Выбирайте и голосуйте за самые интересные доклады! Лучшие из лучших попадут в окончательную программу казанского митапа. Оставить свой голос можно до 25 февраля 2020 года.

Трюки с внешними источниками данных

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    20311    YPermitin    53