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

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

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

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

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

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

Основной проблемой рассматриваемого преобразования в строку является выделение каждого конкретного разряда исходного числа. Например, число 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) КАК Строка

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

343

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

Комментарии
Избранное Подписка Сортировка: Древо
1. spetzpozh 23.02.15 00:42 Сейчас в теме
Моя обычная реакция на публикации Маэстро - посмотрел, почесал репу, плюсанул и пошел дальше )))
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; +59 Ответить
2. ololoanonim 3 23.02.15 11:20 Сейчас в теме
Выглядит весьма круто =)
rpgshnik; +1 Ответить
3. GROOVY 2488 23.02.15 13:41 Сейчас в теме
Фундаментально выглядит. Но нафига? Никогда не понимал, зачем это нужно.
Запрос оперирует данными, нужно красивое представление - для этого есть другие механизмы.
MamatovIA; Gureev; ZeroSumGame; kadild; sanek050388; SP2000; nk25; tsmult; h00k; sergey512; monkbest; Nuobu; DoctorRoza; Dmitryiv; +14 4 Ответить
4. ildarovich 6713 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 69 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 6713 16.10.17 14:27 Сейчас в теме
(41)
Сказали мне, что эта дорога меня приведёт к океану смерти,
И я с полпути повернула вспять.
С тех пор все тянутся предо мною кривые, глухие окольные тропы…
5. break 30 24.02.15 10:35 Сейчас в теме
а без значащихся нулей перед числами можно соорудить?
Maximysis; rpgshnik; +2 Ответить
6. ildarovich 6713 24.02.15 11:17 Сейчас в теме
(5) break, можно, если интерес не праздный. Приведите пример практической задачи - сделаю.
53. FilatovRA 148 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. Поручик 4328 08.03.15 21:26 Сейчас в теме
На статьи автора у меня тоже реакция одна - почитал, плюс, порадовался, что есть люди с фундаментальным образованием. Сам бы ни за что не написал.
Kinestetik; xpess; POLGA; h00k; Evil Beaver; +5 Ответить
11. monkbest 103 17.03.15 11:04 Сейчас в теме
Я правильно понимаю, что строки полученные Вашим методом, потом можно складывать?

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


так то в принципе и 1С запросы - не чисто SQL запросы, а реляционно-подобные "объектные запросы к ВИРТУАЛЬНОЙ объектной модели"...
т.е. в процессе выполнения такого "объектного запроса" - генирится много дополнительного SQL кода для получения этих объектов..
К чему я это пишу - к тому что повальное увлечение переноса абсолютно всего кода в "1С запрос" - совсем не всегда оправдано на платформе "1С". На практике часто бывает быстрей отрабатывает(и пишется..) код с циклами с использованием 1С объектов "ТаблицаЗначений" и т.д.
14. ildarovich 6713 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 Сейчас в теме
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; +49 Ответить
16. ildarovich 6713 26.08.15 13:08 Сейчас в теме
(15) alex_4x, картинку сами рисовали (редактировали) или взяли откуда?
17. alex_4x 81 26.08.15 13:34 Сейчас в теме
(16) Это Дилберт! Они очень наслышаны о нашей 1С :-)
18. Serj1C 476 13.01.16 13:18 Сейчас в теме
Связываться с датами для усечения дробной части? не накладно?
Может попробовать функцию Выразить(&Число-0.49 как Число(15,0)) ?
19. ildarovich 6713 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 6713 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 6713 15.01.16 12:47 Сейчас в теме
(22) Sgeor, я, кажется, понял в чем дело. Есть правило определение точности результатов арифметических операций в запросе в зависимости от точности операндов. Они описаны в статье: Разрядность результатов выражений и агрегатных функций в языке запросов. Видимо, срабатывание этого правила приводит к необходимости привести результат customfieldoption.ID * 0.6 к целому типу! В результате производится не отбрасывание дробной части (как задумано в данном в статье выражении), а округление. Поэтому, видимо, нужно предварительно привести операнд к нужному типу, например, ВЫРАЗИТЬ(Id КАК Число(15, 1)).
Kabal; Sgeor; +2 Ответить
36. kasper076 48 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 6713 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 6713 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 6713 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 118 22.05.17 13:12 Сейчас в теме
32. rpgshnik 1676 09.06.17 04:32 Сейчас в теме
34. kasper076 48 15.06.17 12:30 Сейчас в теме
При разрядности числа 10 знаков, 3 после запятой
ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 6000)) / 6 + 1, 1)

выдает пустую строку.
Из-за того, что получается слишком большое число &Число * 6000.
Этот момент уже разбирался, но я не смог найти где.
35. ildarovich 6713 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 6713 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 6713 22.03.18 13:27 Сейчас в теме
(45) А что получается, если просто
ВЫБРАТЬ Год(&Дата)
47. redfox64 7 22.03.18 16:38 Сейчас в теме
49. IvanVL 11 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 1955 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 6713 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");
Показать
ildarovich; +1 Ответить
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 6713 29.08.19 15:05 Сейчас в теме
(59) Хочу разобраться: чем не устроил запрос из статьи? Способ округления я учитывал, когда составлял запрос и тестировал подход, но все может быть...
Какая у вас СУБД? Давайте я протестирую свой подход на ваших данных (нужно немного времени). Вообще я против такой громоздкости, даже если она работает.
62. ildarovich 6713 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) КАК Строка
ИЗ
	ВТ КАК ВТ
Показать
Прикрепленные файлы:
Оставьте свое сообщение

См. также

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

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

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

05.09.2019    9277    ids79    42       

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

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

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

03.09.2019    7488    YPermitin    67       

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

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

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

17.08.2019    7759    ids79    14       

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

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

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

08.08.2019    9615    ids79    22       

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

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

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

02.08.2019    9506    avalakh    21       

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

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

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

26.07.2019    8694    ids79    6       

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

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

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

17.07.2019    8220    ids79    24       

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

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

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

04.07.2019    6070    SeiOkami    48       

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

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

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

25.06.2019    16811    ids79    16       

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

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

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

11.06.2019    11224    dmurk    134       

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

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

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

16.05.2019    16802    YPermitin    27       

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

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

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

11.05.2019    9473    Eret1k    22       

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

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

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

25.04.2019    4637    m-rv    2       

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

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

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

16.04.2019    7147    m-rv    16       

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

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

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

07.04.2019    16007    ellavs    122       

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

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

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

28.03.2019    12460    ellavs    83       

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

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

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

14.03.2019    12544    YPermitin    52       

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 161

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

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    15022    ids79    9       

EnterpriseData – часть 2. Процесс выгрузки данных 125

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

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    12437    ids79    27       

Новый подход к обмену данными EnterpriseData 202

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

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

14.12.2018    20924    ids79    72       

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации 117

Статья Программист Нет файла v8 v8::УФ БП3.0 УТ11 Россия Windows Бесплатно (free) Практика программирования Обмен через XML

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    18344    ids79    20       

Программное заполнение пользовательских параметров и отборов СКД 135

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

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

13.11.2018    19046    Unk92    18       

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 125

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

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    20528    ids79    40       

Как я делал таймер обратного отсчета в динамическом списке на старой платформе 6

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

В данной статье пойдет речь о том, как на практике я реализовал колонку с обратным отсчетом времени без использования обработчика "ПриПолученииДанныхНаСервере". Платформа в режиме совместимости 8.3.1, управляемые формы (не Такси).

07.11.2018    4048    axelerleo    3       

Вспомогательные инструкции в коде 1С 104

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

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    20169    tormozit    100       

Произвольный код в фоновом режиме 163

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

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

03.09.2018    14355    nikita0832    41       

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C 144

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

У многих начинающих 1С программистов часто возникают вопросы про клиент-серверное взаимодействие в 1С и чтобы разобраться в непростых механизмах платформы, необходимо понять, что же такое контекст, для чего предназначены директивы компиляции, что представляют собой контекстные/внеконтекстные вызовы и как наиболее оптимально описывать прикладные задачи в модулях управляемых форм.

23.08.2018    20841    Rain88    42       

Повышаем эффективность разработки правил обмена 122

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

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    19086    olegtymko    43       

Введение в механизм представлений в ЗУП ред. 3 152

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

В нашей организации на первом же телефонном собеседовании на должность разработчика по ЗУП ред. 3 вас обязательно спросят о том, что такое "Представления".

04.06.2018    24063    xrrg    82       

Как сделать запрос на изменение данных 75

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

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    20991    m-rv    21       

Строим графы средствами 1С (без GraphViz) 42

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

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    16791    slozhenikin_com    19       

Распределение расходов пропорционально продажам 9

Статья Программист Пользователь Нет файла v8 v8::ОУ УТ10 УУ Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Бесплатно (free) Практика программирования

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    11195    Rustig    9       

Просмотр временных таблиц запроса в отладчике без изменения кода 126

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

Данный способ можно использовать для просмотра содержимого временных таблиц запросов (менеджеров временных таблиц) без внесения изменений в код.

24.04.2018    23899    avfed@rambler.ru    19       

Минимализмы 3 350

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

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

19.02.2018    35218    ildarovich    44       

Этюды по программированию. Взаимодействие с Microsoft Word 108

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

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

11.12.2017    25654    milkers    23       

Метод формирования движений в типовых регистрах нетиповыми регистраторами 31

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

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

05.12.2017    21138    itriot11    34       

1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена) 716

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

Что такое КД3? Как начать использовать? Полезные дополнения к документации. Что нужно исправить в типовых обработках и конфигурации. Как изменить правила обмена не снимая конфигурацию с поддержки. Как отлаживать правила обмена?

19.11.2017    136255    MaxS    251       

Заполнение данных по ИНН контрагента с помощью альтернативного сервиса огрн.онлайн 131

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

Код для заполнения данных по ИНН контрагента из ЕГРЮЛ с сайта огрн.онлайн.

01.11.2017    22461    slava_1c    49       

Программные перечисления, ч.2: приемы кэширования при разработке 65

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

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

30.10.2017    20894    unichkin    17       

Разбираемся с настройками компоновки данных 159

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

Краткая шпаргалка по программной работе с настройками СКД

29.10.2017    23833    json    9       

Работа с Excel 287

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

Собрал различные полезности для работы с Excel из 1С. Иногда приходится форматировать документ Excel программно из 1С. Так вот, чтобы не искать постоянно на просторах интернета как сделать левое выравнивание в ячейке Excel из 1С и т.п. решил опубликовать это...

23.10.2017    24207    arakelyan    39       

Добавление команд печати в конфигурациях на БСП 2.4.3 (в частности, в самописных документах в Бухгалтерии 3.0 после релиза 3.0.52.35) 143

Статья Программист Нет файла v8 v8::БУ БП3.0 Россия Бесплатно (free) Печатные формы документов Практика программирования БСП (Библиотека стандартных подсистем)

В статье https://infostart.ru/public/237013/ пользователя nick max рассматривался список действий для подключения команд печати в Бухгалтерии 3.0, работающей на БСП 2.3.6. В новом релизе Бухгалтерии 3.0.52.35 от 15.09.2017г. стала использоваться БСП 2.4.3, из-за чего произошли изменения в процедурах общих модулей, связанных с механизмом печати, и в процедурах их вызова в формах документов и в формах списков. Рассмотрим их.

18.09.2017    46276    bugtester    43       

Отказ от работы с временными файлами при работе с двоичными данными или Потоки как простая замена ADODB.Stream и временным файлам 126

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

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

12.09.2017    18016    vardeg    31