"Распределение в запросе" или "избавляемся от перебора"

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

Разработка - Математика и алгоритмы

запросы распределение перебор оптимизация серии

Хороший перебор - это отсутствие перебора. Рассмотрим пример замены полного перебора запросом.

В свое время, года 3 назад, возникла необходимость оптимизации конфигурации и устранения ее узких мест в одной компании. Одним из таких узких мест оказался, казалось бы, безобидный, механизм распределения товаров в реализации по сериям. Суть в том, что строк распределялось достаточно много и было это очень медленно. Не миллионы за раз, конечно, но на это самое распределение для одного документа могло уходить до минуты. От этого становилось всем очень грустно, т.к. параллельно бухгалтера препроводили документы, другие операторы тоже формировали документы отгрузки и когда отгружали «большого» клиента – жизнь на некоторое время замирала. К слову сказать, размер базы 1С за 2-3 года на тот момент составлял ~500 Гб, заказов от одного клиента за день могло прийти десяток-другой, а в некоторых из них строк могло быть более 1000, в общем «Реализация товаров и услуг» на 1000 строк - это не было ничем сверхъестественным. Реиндексация, обновление статистики, шринк и другие необходимые процедуры проводились регулярно, но сейчас речь не об этом. Вернемся к нашему объекту оптимизации. На тот момент механизм распределения был до банального прост:

  1. Запросом получали остатки по сериям (Номенклатура – Серия – Количество)
  2. Другим запросом получали таблицу товаров к отгрузке (Номенклатура – Заказ покупателя – Количество). 
  3. Проходил обыкновенный перебор для каждой номенклатуры по принципу «Пока КоличествоКРаспределению > 0 Цикл …….. ». 

Т.к. я всегда придерживался позиции, что сам факт перебора на больших объемах данных – это уже само по себе узкое место, то возможность «улучшения» алгоритма перебора я даже рассматривать не планировал. Нужна была альтернатива. Также на тот момент я уже давно набил руку в оптимизации сложных запросов и укрепился в выводе, что нет ни одной задачи, которую нельзя было бы решить исключительно запросом и точно знал, что качественный запрос (пакет запросов) в 99% случаев окажется самым эффективным решением, чем какая-либо пост-обработка результатов запроса. Вопрос оставался только в нахождении этого решения). 
Выходил я на перекур с достаточно тривиальным условием задачи (распределить количество по измерениям одной таблицы на количество по измерениям из другой) и 2-мя тезисами:

  • Мы имеем 2 таблицы, которые и так собираются запросом
  • SQL не знает никакого «Распределить». SQL знает только «больше», «меньше», «равно» (утрированно). Надо дать ему некий параметр для сравнения. Числовой параметр, по которому будет понятно какое количество еще можно распределить в условную строку. 

И в этот самый момент, когда я мысленно проговаривал второй тезис, слово «еще» и натолкнуло меня на решение. Далее, рисуя палочкой на снегу, я не успел докурить, как уже побежал пробовать свою гипотезу в консоли запросов.
Рассмотрим ниже простой пример:
У нас есть складские ячейки с количеством вмещаемого в них товара с одной стороны (A, B, C, D) и сам товар (X, Y, Z), который необходимо «как-то» разложить по этим ячейкам, но так, чтоб в ячейку не положили больше товара, чем может быть в ней места. 
A – 10 мест
B – 1 место
C – 5 мест
D – 8 мест

X – 13 шт
Y – 1 шт
Z – 4 шт

Результатом должна стать таблица распределения:
A-X-10
B-X-1
C-X-2
C-Y-1
C-Z-2
D-Z-2

Для этого нам надо определить порядок распределения, сделать это оказалось до банального просто:

ВЫБРАТЬ
    Ячейки.Ячейка КАК Ячейка,
    Ячейки.Количество,
    ЕСТЬNULL(СУММА(Ячейки1.Количество), 0) + 1 КАК ПорядокРаспределенияС,
    ЕСТЬNULL(СУММА(Ячейки1.Количество), 0) + Ячейки.Количество КАК ПорядокРаспределенияПо
ИЗ
    Ячейки КАК Ячейки
        ЛЕВОЕ СОЕДИНЕНИЕ Ячейки КАК Ячейки1
        ПО Ячейки.Ячейка > Ячейки1.Ячейка

СГРУППИРОВАТЬ ПО
    Ячейки.Ячейка,
    Ячейки.Количество


Кстати, здесь же можно учесть и порядок распределения, если, например, в какие-то ячейки товар надо класть в первую очередь. Решается изменением условия в соединении. 
Тоже самое и с товарами:

ВЫБРАТЬ
    Товары.Товар КАК Товар,
    Товары.Количество,
    ЕСТЬNULL(СУММА(Товары1.Количество), 0) + 1 КАК ПорядокРаспределенияС,
    ЕСТЬNULL(СУММА(Товары1.Количество), 0) + Товары.Количество КАК ПорядокРаспределенияПо
ПОМЕСТИТЬ ТоварыПоПорядку
ИЗ
    Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ Товары КАК Товары1
        ПО Товары.Товар > Товары1.Товар

СГРУППИРОВАТЬ ПО
    Товары.Товар,
    Товары.Количество

Для простоты понимания разложу все эти позиции поштучно в таблице и наложу одну на другую в порядке распределения:

Нам просто нужно написать граничные условия. А теперь осталось просто соединить эти таблицы и получим наш результат:

ВЫБРАТЬ
    ЯчейкиПоПорядку.Ячейка КАК Ячейка,
    ТоварыПоПорядку.Товар КАК Товар,
    ВЫБОР
        КОГДА ТоварыПоПорядку.ПорядокРаспределенияПо < ЯчейкиПоПорядку.ПорядокРаспределенияПо
            ТОГДА ТоварыПоПорядку.ПорядокРаспределенияПо
        ИНАЧЕ ЯчейкиПоПорядку.ПорядокРаспределенияПо
    КОНЕЦ - ВЫБОР
        КОГДА ТоварыПоПорядку.ПорядокРаспределенияС > ЯчейкиПоПорядку.ПорядокРаспределенияС
            ТОГДА ТоварыПоПорядку.ПорядокРаспределенияС
        ИНАЧЕ ЯчейкиПоПорядку.ПорядокРаспределенияС
    КОНЕЦ + 1 КАК Количество
ИЗ
    ЯчейкиПоПорядку КАК ЯчейкиПоПорядку
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыПоПорядку КАК ТоварыПоПорядку
        ПО (ЯчейкиПоПорядку.ПорядокРаспределенияС <= ТоварыПоПорядку.ПорядокРаспределенияПо
                И ЯчейкиПоПорядку.ПорядокРаспределенияПо >= ТоварыПоПорядку.ПорядокРаспределенияС)

Сразу оговорюсь, что в запросе умышленно добавлено большее количество полей, чем надо. Можно было бы обойтись и одной границей распределения (нарастающим итогом) и не делать «+1», но как мне показалось – в таком виде это более наглядно для понимания. Оптимизацию запросов мы в этой теме не рассматриваем, поэтому и индексы здесь тоже не описаны. Ну а более сложные алгоритмы распределения (по нескольким измерениям, например) решаются только изменением условий соединения и проверки границ.

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

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

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

Лучшие комментарии
23. ildarovich 7018 16.12.16 15:30 Сейчас в теме
Еще один пример того, что новое - это хорошо забытое старое
Вот ссылки:

http://infostart.ru/public/20221/
http://infostart.ru/public/58966/
http://infostart.ru/public/61295/
http://infostart.ru/public/62899/
http://infostart.ru/public/68225/
http://infostart.ru/public/88999/
http://infostart.ru/public/122548/

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

Теперь по сути:

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

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

В общем, я против крайностей и "универсальных решений", за более взвешенное и обдуманное решение в каждом конкретном случае.
Krasnyj; serg_infostart; Xershi; Krio2; apk-agroeco; 1cWin; hornet_X; hydro2588_2015; mason; Silenser; dbaser; 1cprogr_nsk; igormiro; Rego1337h; Andrsan; unichkin; PrinzOfMunchen; ra9000; sasha777666; h00k; Ali1976; sevushka; kuzyara; DrAku1a; sorb; ASysuev; PetrPan; Zabava_; varovinm; zarucheisky; MSChe; Dem1urg; bong; ABudnikov; Danil.Potapov; kiros; Chif13; nsirotkin@mail.ru; HAMMER_59; ZLENKO; soulsteps; brr; Turn123; Dach; Бывалый77; KoldunOne; Новиков; le0nid; Leoway; Sheff; charushkin; Saint13; support; ILM; 1cmax; bulpi; Сурикат; genayo; starik-2005; c1nil; Alias; Armando; SunShinne; karpik666; uncle_Vasya; ardn; корум; ЧерныйКот; odin777; NeviD; +70 Ответить
Остальные комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. coollerinc 40 16.12.16 11:15 Сейчас в теме
Пытаюсь воспроизвести пример не получается, смущает, это сравнение "ПО Ячейки.Ячейка > Ячейки1.Ячейка" и "Товары.Товар > Товары1.Товар"

Это ссылки сравниваем?
2. alexandersh 215 16.12.16 11:27 Сейчас в теме
(1) Можно сравнивать любой реквизит, если он уникален и его тип допускает операции сравнения, но только ссылки точно гарантируют уникальность. В моем примере сравнивались ссылки.
3. alexandersh 215 16.12.16 11:29 Сейчас в теме
Ну а тестовый образец запроса можно сделать вообще на строковых данных )

выбрать "А" как Товар, 111 как Количество
поместить Товары

объединить

выбрать "Б" ....

и т.д.
4. coollerinc 40 16.12.16 12:24 Сейчас в теме
Спасибо все работает, это просто я офигел немного от такого подхода к запросам, для меня это в новинку. Срин шот прикладываю, которым можно дополнить статью
Прикрепленные файлы:
Innuil; klinval; +2 Ответить
6. alexandersh 215 16.12.16 12:57 Сейчас в теме
(4) Рад, если статья оказалась полезная ;)
7. sashocq 191 16.12.16 13:17 Сейчас в теме
Это гениально!
Прочитав постановку задачу ожидал большую кучу подзапросов с временными запросами. Но решение оказалось на удивление элегантным. Сохраню себе, пригодится.
8. Just4Fun 31 16.12.16 13:19 Сейчас в теме
Хорошее решение. Рекомендую.

Была аналогичная задача при закрытии месяца в УПП.
В типовом алгоритме был фрагмент кода, который строил большую таблицу перехода номенклатуры из одного состояния другое. А реализовано это было через "цикл в цикле" по таблице в 20 тыс. строк, что в итоге давало 400 млн итераций, и в свою очередь общее время проведения документа составляло 3-4 часа по каждому из разделов учета (БУ, НУ, УПР).
Здесь даже была статья по этой проблеме и ее решению. http://infostart.ru/public/176644/
Попробовал решение из статьи - эффект был, но не скажу, что проблема ушла. выигрыш был порядка 10%.

Несколько дней ходил и крутил проблему в голове. Идея, как и у автора текущей статьи, осенила неожиданно.
В итоге переложил типовой цикл на запрос и время его выполнения составило что-то около 3-5 секунд, а общее время проведения документа - несколько минут.
9. МихаилМ 16.12.16 13:52 Сейчас в теме
к сожалению 1с8 не умеет сравнивать ссылки на болше-меньше в запросе
хоть не ругается на эту ошибку.
поэтому,

Товары.Товар > Товары1.Товар - ошибочная конструкция.

dgolovanov; +1 2 Ответить
10. NeviD 16.12.16 13:56 Сейчас в теме
(9) Разве не умеет? Сам не раз так делал - всегда отлично отрабатывает.
Например, для нумерации данных во временной таблице. Так как в 1С нет подобия ROW_NUMBER, то для нумерации можно соединять таблицу саму с собой с сравнением по Таблица1.Ссылка > Таблица2.Ссылка.
И все хорошо работало.
11. alexandersh 215 16.12.16 14:18 Сейчас в теме
(9) Михаил, вопрос на засыпку: а SQL Server Engine умеет сравнивать UNIQUEIDENTIFIER на больше-меньше? ;-)
а то вы только что открытие для меня сделали))
12. alexandersh 215 16.12.16 14:19 Сейчас в теме
а вообще, ребята, спасибо всем за отзывы, прямо воодушевили меня покопаться в закромах, где-то есть у меня еще несколько старых примеров обработки больших объемов данных запросами.. может руки дойдут - напишу еще статейку )
Mur_inna; uncle_Vasya; +2 Ответить
13. vasilev2015 1828 16.12.16 15:03 Сейчас в теме
Коллеги, запрос тоже может при исполнении запускать перебор.

Не обольщайтесь внешним видом.

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

Например, в объектной модели программирования Таблицу значений индексировать командой ДобавитьИндекс и использовать НайтиСтроки(Отбор) вместо Для Каждого Строка ИЗ ТаблицаЗначений.

Статья не плюсовая, а скорее минусовая.
sasha777666; uncle_Vasya; +2 Ответить
15. alexandersh 215 16.12.16 15:09 Сейчас в теме
(13) Николай, я всегда за критику, но только когда она конструктивная. Если интересно - посмотри подобный запрос в профайлере и сравни с отбором по таблице значний (даже при добавлении индекса), результат кардинально будет отличаться. Это первое. Ну а второе - по поводу перебора в запросе - Не могу себе представить ситуацию, когда соединение по ключевым индексированным полям (Ref) вызовут в SQL перебор. Такого даже при желании не так просто добиться, или я не прав? ;-)
uncle_Vasya; +1 Ответить
14. МихаилМ 16.12.16 15:05 Сейчас в теме
извините. ошибся . но с с другими типами данных ссылки не умеет сравнивать , хотя и не ругается
19. alexandersh 215 16.12.16 15:16 Сейчас в теме
(14) Ах, речь о сравнении ссылок с другими типами... ну да, забавно ))
"Хозяйке на заметку": запрос вида "выбрать датавремя(2016,1,1,1,1,30) < 3.14" тоже ошибки не вызовет, однако его целесообразность и практический смысл лично для меня сомнительны)
uncle_Vasya; +1 Ответить
16. Fragster 1010 16.12.16 15:13 Сейчас в теме
а теперь смотрим. допустим у нас склад с 1000 ячеек. (или остатки с 1000 мелких партий или еще что-то). первым запросом мы получаем 1000000 строк и далее тот же цикл происходит на стороне скуля (nested loops в плане запросов), только не 1000 строк, а 1000000.
uncle_Vasya; +1 Ответить
18. МихаилМ 16.12.16 15:15 Сейчас в теме
дополню
SQL Server Engine
умеет сравнивать bynary(16) c числами
но
1с8 в запросе к субд заменяет конструкцию типа ссылка > число

на истина ()

и

ссылка < число - на ложь .

прошу еще раз прощения за замечание не по делу.


умеет ли SQL Server Engine сравнивать значения типа UNIQUEIDENTIFIER - точно не знаю. но думаю что умеет.


20. NeviD 16.12.16 15:26 Сейчас в теме
(16) Если склад с 1000 ячеек, то в первом запросе будет 1000 строк. Там просто значения ячеек склада дополняются значенями ПорядокРаспределенияС и ПорядокРаспределенияПо.
22. alexandersh 215 16.12.16 15:29 Сейчас в теме
(16) Первым запросом мы получаем 1000 строк, смотрите внимательней.. и это в худшем случае, когда надо распределить ВСЕ на ВСЕ ;-)
если будет интересно - потом напишу статью, как используя этот метод, одним запросом на лету собрать движения по партиям в базе 1С Розница > 50 Гб, где партионного учета нет как такового, а задача была сделать такой отчет, не меняя типовую конфигурацию) отчет отрабатывал секунд 10-20 за месяц (10 розничных магазинов, торговля продуктами - в общем движений много).конечно, это уже была модификация данного метода, более оптимизированная, но я бы посмотрел, как бы вы это делали через таблицы значений))
24. Fragster 1010 16.12.16 15:46 Сейчас в теме
(22) да, я ошибся. первым запросом мы просто делаем итерацию из 1000000 циклов, просто делает её скуль. На выходе количество строк не меняется, да.
про количество строк - например 1000 пустых ячеек при ячеистом хранении - не редкость. У меня на практике был склад с 50000 ячейками и 15к наименований на них.

обход двух таблиц одним циклом делается достаточно просто. просто вместо "Для каждого" используется "Пока Истина" и две переменных-счетчика.
29. alexandersh 215 17.12.16 14:24 Сейчас в теме
(24) а запросом все равно будет быстрей) читайте мой предыдущий ответ Сергею )
43. HelenV 03.02.17 13:26 Сейчас в теме
17. Fragster 1010 16.12.16 15:14 Сейчас в теме
А можно в один проход обойти две одинаковым образом отсортированные таблицы.
21. ЧерныйКот 16.12.16 15:29 Сейчас в теме
Мне понравилось. Автор запросами разложил поштучно ячейки и товары, а потом соединил, просто и логично.
23. ildarovich 7018 16.12.16 15:30 Сейчас в теме
Еще один пример того, что новое - это хорошо забытое старое
Вот ссылки:

http://infostart.ru/public/20221/
http://infostart.ru/public/58966/
http://infostart.ru/public/61295/
http://infostart.ru/public/62899/
http://infostart.ru/public/68225/
http://infostart.ru/public/88999/
http://infostart.ru/public/122548/

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

Теперь по сути:

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

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

В общем, я против крайностей и "универсальных решений", за более взвешенное и обдуманное решение в каждом конкретном случае.
Krasnyj; serg_infostart; Xershi; Krio2; apk-agroeco; 1cWin; hornet_X; hydro2588_2015; mason; Silenser; dbaser; 1cprogr_nsk; igormiro; Rego1337h; Andrsan; unichkin; PrinzOfMunchen; ra9000; sasha777666; h00k; Ali1976; sevushka; kuzyara; DrAku1a; sorb; ASysuev; PetrPan; Zabava_; varovinm; zarucheisky; MSChe; Dem1urg; bong; ABudnikov; Danil.Potapov; kiros; Chif13; nsirotkin@mail.ru; HAMMER_59; ZLENKO; soulsteps; brr; Turn123; Dach; Бывалый77; KoldunOne; Новиков; le0nid; Leoway; Sheff; charushkin; Saint13; support; ILM; 1cmax; bulpi; Сурикат; genayo; starik-2005; c1nil; Alias; Armando; SunShinne; karpik666; uncle_Vasya; ardn; корум; ЧерныйКот; odin777; NeviD; +70 Ответить
28. alexandersh 215 17.12.16 14:23 Сейчас в теме
(23) Сергей, в целом позиция понятна и отчасти правильная, я даже ваш ответ выделил лучшим).
Но по поводу конкретного случая готов поспорить: во-первых в изначальном условии я четко оговорил, что у нас уже есть 2 таблицы, которые мы получаем 2-мя другими запросами. Очевидно, что эти таблицы уже содержат отфильтрованный набор данных.
Это во-первых.
Во-вторых при продумывании своих решений я руководствуюсь именно пониманием как работает движок SQL. В данном конкретном примере, когда мы будем собирать нарастающий итог даже по всей таблице с 1 млн записей, при соединении этой таблицы самой с собой будет не 1000000*1000000 строк (полный перебор SQL), а те же 1 млн строк. SQL при выполнении соединения по ключевому полю руководствуется именно этим индексом, а так как агрегатные функции (в данном случае сумма) очень качественно обрабатываются движком SQL, то учитывая индекс по которому будет организован поиск и использование реквизитов правой части соединения только для расчета агрегатной суммы - SQL умеет хранить нарастающий итог по уже обработанным записям и будет всего 1 проход по этой таблицы - это можно будет при желание увидеть в плане запроса.
Простым языком:
запрос вида
"ВЫБРАТЬ
Ячейки.Ячейка КАК Ячейка,
Ячейки.Количество,
ЕСТЬNULL(СУММА(Ячейки1.Количество), 0) + 1 КАК ПорядокРаспределенияС,
ЕСТЬNULL(СУММА(Ячейки1.Количество), 0) + Ячейки.Количество КАК ПорядокРаспределенияПо
ИЗ
Ячейки КАК Ячейки
ЛЕВОЕ СОЕДИНЕНИЕ Ячейки КАК Ячейки1
ПО Ячейки.Ячейка > Ячейки1.Ячейка

СГРУППИРОВАТЬ ПО
Ячейки.Ячейка,
Ячейки.Количество"

будет стоить не намного дороже, чем даже такой:

"ВЫБРАТЬ
Ячейки.Ячейка КАК Ячейка,
Ячейки.Количество
ИЗ
Ячейки КАК Ячейки

СГРУППИРОВАТЬ ПО
Ячейки.Ячейка,
Ячейки.Количество"

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

Далее: почему еще запрос быстрее перебора? - да потому что перебор, например, в 1с, и, хотя бы тот же перебор, в SQL - это кардинально отличающиеся по затратам процедуры. нельзя забывать, что 1с - это классический интерпретатор, даже в случае выполнения кода на стороне сервера. И как бы это банально не звучало - каждая новая строка кода - это достаточно сложная операция для сервера (опять же все познается сравнении).

ну а касательно этой задачи - я готов с кем угодно посмотрить, что распределение в запросе для БОЛЬШИХ объемов данных - всегда оптимальней делать запросом. я делаю акцент именно на больших объемах данных, когда речь идет о распределении тысяч строк НА тысячи строк. в остальных же случаях - это место навряд ли потребовало оптимизации и там бы преспокойно жил бы Цикл))

Я не агитирую переписывать все циклы на запросы - я агитирую не делать больших циклов в узких местах ;-)
Andreynikus; +1 Ответить
31. ildarovich 7018 19.12.16 14:47 Сейчас в теме
(28)(29) Вы очень глубоко заблуждаетесь!

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

При расчете нарастающего итога:

N Число строк Затрачено миллисекунд
1 1 000 302
2 2 000 998
3 3 000 2 263
4 4 000 3 840
5 5 000 5 971
6 6 000 8 443
7 7 000 12 817
8 8 000 14 846
9 9 000 18 851
10 10 000 23 346

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

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

Что прямо противоречит озвученным вами выводам.

Вот таблица:
N Метод Число строк Затрачено миллисекунд
1 Скрипт 100 8
2 Запрос 100 48
3 Скрипт 200 8
4 Запрос 200 56
5 Скрипт 1000 37
6 Запрос 1000 716
7 Скрипт 2000 75
8 Запрос 2000 2457
9 Скрипт 10000 379
10 Запрос 10000 52873
11 Скрипт 20000 774
12 Запрос 20000 227231

Посмотрите на результат при двадцати тысячах строк: 0,7 секунд для кода против 227(!!!) секунд для запроса.
Для распределения по таблицам значений использовалась взятая из "Минимализмов" (http://infostart.ru/public/306536/) функция (задача 7).

Если захотите перепроверить, вот обработка, которой я пользовался:
Прикрепленные файлы:
ДоказательстваПротивЗапроса.erf
d4rkmesa; Serj1C; sasha777666; myjob1c; varovinm; sulfur17; ZLENKO; Dach; NeviD; klinval; +10 Ответить
39. alexandersh 215 21.12.16 10:02 Сейчас в теме
(31) да, действительно, спору нет, скрипт достаточно качественный, работает быстрее, мне понравился, по поводу скорости - поиграюсь на выходных со ссылочными типами, давно уже планы запроса не смотрел, снова стало интересно
25. klinval 293 16.12.16 16:00 Сейчас в теме
Для тех, кому как и мне, чтобы понять нужно поиграться в консоле запросов:
ВЫБРАТЬ
	"A" КАК Ячейка,
	10 КАК Количество
ПОМЕСТИТЬ Ячейки

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

ВЫБРАТЬ
	"B",
	1

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

ВЫБРАТЬ
	"C",
	5

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

ВЫБРАТЬ
	"D",
	8
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	"x" КАК Товар,
	13 КАК Количество
ПОМЕСТИТЬ Товары

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

ВЫБРАТЬ
	"у",
	1

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

ВЫБРАТЬ
	"z",
	4
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Ячейки.Ячейка КАК Ячейка,
	Ячейки.Количество КАК Количество,
	ЕСТЬNULL(СУММА(Ячейки1.Количество), 0) + 1 КАК ПорядокРаспределенияС,
	ЕСТЬNULL(СУММА(Ячейки1.Количество), 0) + Ячейки.Количество КАК ПорядокРаспределенияПо
ПОМЕСТИТЬ ЯчейкиПоПорядку
ИЗ
	Ячейки КАК Ячейки
		ЛЕВОЕ СОЕДИНЕНИЕ Ячейки КАК Ячейки1
		ПО Ячейки.Ячейка > Ячейки1.Ячейка

СГРУППИРОВАТЬ ПО
	Ячейки.Ячейка,
	Ячейки.Количество
;

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

СГРУППИРОВАТЬ ПО
	Товары.Товар,
	Товары.Количество
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЯчейкиПоПорядку.Ячейка КАК Ячейка,
	ТоварыПоПорядку.Товар КАК Товар,
	ВЫБОР
		КОГДА ТоварыПоПорядку.ПорядокРаспределенияПо < ЯчейкиПоПорядку.ПорядокРаспределенияПо
			ТОГДА ТоварыПоПорядку.ПорядокРаспределенияПо
		ИНАЧЕ ЯчейкиПоПорядку.ПорядокРаспределенияПо
	КОНЕЦ - ВЫБОР
		КОГДА ТоварыПоПорядку.ПорядокРаспределенияС > ЯчейкиПоПорядку.ПорядокРаспределенияС
			ТОГДА ТоварыПоПорядку.ПорядокРаспределенияС
		ИНАЧЕ ЯчейкиПоПорядку.ПорядокРаспределенияС
	КОНЕЦ + 1 КАК Количество,
	ТоварыПоПорядку.ПорядокРаспределенияПо,
	ЯчейкиПоПорядку.ПорядокРаспределенияПо КАК ПорядокРаспределенияПо1,
	ТоварыПоПорядку.ПорядокРаспределенияС,
	ЯчейкиПоПорядку.ПорядокРаспределенияС КАК ПорядокРаспределенияС1
ИЗ
	ЯчейкиПоПорядку КАК ЯчейкиПоПорядку
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыПоПорядку КАК ТоварыПоПорядку
		ПО ЯчейкиПоПорядку.ПорядокРаспределенияС <= ТоварыПоПорядку.ПорядокРаспределенияПо
			И ЯчейкиПоПорядку.ПорядокРаспределенияПо >= ТоварыПоПорядку.ПорядокРаспределенияС
Показать

Автору плюс!
and1024; Xershi; alex-pro; sulfur17; +4 Ответить
38. sulfur17 36 21.12.16 09:17 Сейчас в теме
(25)
ВЫБРАТЬ
"у",
1

Большое спасибо за запрос, очень помогли разобраться. Только у вас вот тут буква "у" русская, поэтому результат не совпадает с результатом топикстартера.
26. MarryJane 25 16.12.16 19:22 Сейчас в теме
О, нужно будет попробовать распределить сумму долга по документам. Отличая идея. если просто : Берем сумму долга на начало. Берем документы реализации и распределяем с конца на эту сумму долга, и получаем последние неоплаченные документы, и не требуется вести оплаты по документам.
27. genayo 17.12.16 07:53 Сейчас в теме
(26) По одному контрагенту это будет приемлемо. А вот по 1000 уже печально...
30. ture 565 19.12.16 14:16 Сейчас в теме
(00) порадовал заголовое и количество звёзд. Стало приятно на душе - "побольше" бы таких специалистов! Но скоро расстроился, т.к.давно влился в ряды таких специалистов.
Вы ведь знаете, как на самом деле перераспеделяется нагрузка между сервером 1С и сервером SQL(если не файловая)? Я обеими руками поддерживаю Вашу идею, если быть до конца правдивым.
32. I_G_O_R 62 19.12.16 21:23 Сейчас в теме
Попробовал использовать дробные числа, запрос работает неправильно...
ВЫБРАТЬ
	"A" КАК Ячейка,
	3.8 КАК Количество
ПОМЕСТИТЬ Ячейки

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

ВЫБРАТЬ
	"B",
	1.2

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

ВЫБРАТЬ
	"C",
	5

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

ВЫБРАТЬ
	"D",
	8
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	"x" КАК Товар,
	4.5 КАК Количество
ПОМЕСТИТЬ Товары

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

ВЫБРАТЬ
	"у",
	1.5

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

ВЫБРАТЬ
	"z",
	4
;

Показать
33. klinval 293 20.12.16 09:12 Сейчас в теме
(32) да всё вроде логично - запрос расчитан на целые числа! Хотите не целые, вот вам:
ВЫБРАТЬ
	"A" КАК Ячейка,
	3.8 КАК Количество
ПОМЕСТИТЬ Ячейки

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

ВЫБРАТЬ
	"B",
	1.2

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

ВЫБРАТЬ
	"C",
	5

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

ВЫБРАТЬ
	"D",
	8
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	"x" КАК Товар,
	4.5 КАК Количество
ПОМЕСТИТЬ Товары

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

ВЫБРАТЬ
	"у",
	1.5

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

ВЫБРАТЬ
	"z",
	4
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Ячейки.Ячейка КАК Ячейка,
	Ячейки.Количество КАК Количество,
	ЕСТЬNULL(СУММА(Ячейки1.Количество), 0) + 0.01 КАК ПорядокРаспределенияС,
	ЕСТЬNULL(СУММА(Ячейки1.Количество), 0) + Ячейки.Количество КАК ПорядокРаспределенияПо
ПОМЕСТИТЬ ЯчейкиПоПорядку
ИЗ
	Ячейки КАК Ячейки
		ЛЕВОЕ СОЕДИНЕНИЕ Ячейки КАК Ячейки1
		ПО Ячейки.Ячейка > Ячейки1.Ячейка

СГРУППИРОВАТЬ ПО
	Ячейки.Ячейка,
	Ячейки.Количество
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Товары.Товар КАК Товар,
	Товары.Количество,
	ЕСТЬNULL(СУММА(Товары1.Количество), 0) + 0.01 КАК ПорядокРаспределенияС,
	ЕСТЬNULL(СУММА(Товары1.Количество), 0) + Товары.Количество КАК ПорядокРаспределенияПо
ПОМЕСТИТЬ ТоварыПоПорядку
ИЗ
	Товары КАК Товары
		ЛЕВОЕ СОЕДИНЕНИЕ Товары КАК Товары1
		ПО Товары.Товар > Товары1.Товар

СГРУППИРОВАТЬ ПО
	Товары.Товар,
	Товары.Количество
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЯчейкиПоПорядку.Ячейка КАК Ячейка,
	ТоварыПоПорядку.Товар КАК Товар,
	ВЫБОР
		КОГДА ТоварыПоПорядку.ПорядокРаспределенияПо < ЯчейкиПоПорядку.ПорядокРаспределенияПо
			ТОГДА ТоварыПоПорядку.ПорядокРаспределенияПо
		ИНАЧЕ ЯчейкиПоПорядку.ПорядокРаспределенияПо
	КОНЕЦ - ВЫБОР
		КОГДА ТоварыПоПорядку.ПорядокРаспределенияС > ЯчейкиПоПорядку.ПорядокРаспределенияС
			ТОГДА ТоварыПоПорядку.ПорядокРаспределенияС
		ИНАЧЕ ЯчейкиПоПорядку.ПорядокРаспределенияС
	КОНЕЦ + 0.01 КАК Количество,
	ТоварыПоПорядку.ПорядокРаспределенияПо КАК ПорядокРаспределенияПо,
	ЯчейкиПоПорядку.ПорядокРаспределенияПо КАК ПорядокРаспределенияПо1,
	ТоварыПоПорядку.ПорядокРаспределенияС КАК ПорядокРаспределенияС,
	ЯчейкиПоПорядку.ПорядокРаспределенияС КАК ПорядокРаспределенияС1
ИЗ
	ЯчейкиПоПорядку КАК ЯчейкиПоПорядку
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыПоПорядку КАК ТоварыПоПорядку
		ПО (ЯчейкиПоПорядку.ПорядокРаспределенияС <= ТоварыПоПорядку.ПорядокРаспределенияПо)
			И (ЯчейкиПоПорядку.ПорядокРаспределенияПо >= ТоварыПоПорядку.ПорядокРаспределенияС)

УПОРЯДОЧИТЬ ПО
	Ячейка,
	Товар
Показать

Сотых для большинства случаев должно хватить. В 1С обычно всё до сотых округляется (кроме курса валюты).

Дано:
Ячейка Количество
A 3,8
B 1,2
C 5
D 8

Товар Количество
x 4,5
у 1,5
z 4

Результат:
A x 3,8
B x 0,7
B z 0,5
C z 3,5
C у 1,5
36. I_G_O_R 62 20.12.16 10:19 Сейчас в теме
(33) (34) да я пробовал вместо 1 использовать 0.001, просто я заменил только в 2-местах вместо 3-х((

Я проверил обработку из (31), разница к сожалению большая и она не в пользу запроса. Я по ЗУПу еще помню, этот нарастающий итог не такой уж хороший, под конец года НДФЛ считался дольше чем в начале года (правда как ща не знаю).

Я собственно за то, что СУБД нам отдает данные, а логика выполняется на сервере приложений. Когда логика выполняется на СУБД, этот код со временем превращается в неподдерживаемый хаос.
37. ildarovich 7018 20.12.16 12:55 Сейчас в теме
(32 (33) (34) Не знаю, зачем там что-то прибавлять-вычитать, работает вообще без этого. Вот в этом, чуть более коротком варианте запрос работает для чисел вообще какой угодно разрядности:
ВЫБРАТЬ
	Ячейки.Ячейка,
	СУММА(Слева.Количество) - МИНИМУМ(Ячейки.Количество) КАК КоличествоОт,
	СУММА(Слева.Количество) КАК КоличествоДо
ПОМЕСТИТЬ ЛинейкаЯчеек
ИЗ
	Ячейки КАК Ячейки
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Ячейки КАК Слева
		ПО (Слева.Ячейка <= Ячейки.Ячейка)

СГРУППИРОВАТЬ ПО
	Ячейки.Ячейка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Товары.Товар,
	СУММА(Слева.Количество) - МИНИМУМ(Товары.Количество) КАК КоличествоОт,
	СУММА(Слева.Количество) КАК КоличествоДо
ПОМЕСТИТЬ ЛинейкаТоваров
ИЗ
	Товары КАК Товары
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Товары КАК Слева
		ПО (Слева.Товар <= Товары.Товар)

СГРУППИРОВАТЬ ПО
	Товары.Товар
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Ячейки.Ячейка КАК Ячейка,
	Товары.Товар КАК Товар,
	ВЫБОР
		КОГДА Товары.КоличествоДо < Ячейки.КоличествоДо
			ТОГДА Товары.КоличествоДо
		ИНАЧЕ Ячейки.КоличествоДо
	КОНЕЦ - ВЫБОР
		КОГДА Товары.КоличествоОт > Ячейки.КоличествоОт
			ТОГДА Товары.КоличествоОт
		ИНАЧЕ Ячейки.КоличествоОт
	КОНЕЦ КАК Количество
ИЗ
	ЛинейкаЯчеек КАК Ячейки
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЛинейкаТоваров КАК Товары
		ПО Ячейки.КоличествоОт < Товары.КоличествоДо
			И Ячейки.КоличествоДо > Товары.КоличествоОт
Показать

Идея запроса вовсе не в целых числах, а в том, чтобы построить друг против друга линейку товаров и ячеек и найти пересечение отрезков на этих линейках.
Вот в этом обсуждении есть картинка: http://forum.infostart.ru/forum9/topic32459/message361861/#message361861 .
KazanKokos; sulfur17; NeviD; klinval; +4 Ответить
34. ture 565 20.12.16 09:13 Сейчас в теме
(32) нечего пенять на запрос. Его идея в целых числах, значит Вам нужно множить все на 1000
35. Dach 295 20.12.16 09:30 Сейчас в теме
Статья хорошая, хотя техника распределения нарастающего итога конечно не нова.

Как я был расстроен и опечален, когда немного более подробно изучил T-SQL... Мы здесь с вами изворачиваемся, чтобы посчитать нарастающий итог, таблицы сами с собой соединяем и т.д. А у sql-щиков есть уже "по умолчанию" ранжирование в запросах, расчет нарастающего итога и прочие плюшки - все буквально одной-двумя строками кода... Мечтательно представил, как бы парочку своих мегазапросов переписал на куда как более компактно.... Эх ))))
40. Infector 160 27.01.17 09:13 Сейчас в теме
В целом неплохо. Однако же как обстоит дело с ошибками округлений? На практике чаще приходится сталкиваться с подобными задачами немного видоизмененного рода, например с примесью механизмов FIFO/LIFO. Одна таблица содержит строки, которые можно разделить на группы по ряду признаков. (Например перечень номенклатуры с количествами, но еще неизвестной стоимостью). Вторая таблица содержит значения, которые нужно распределить и при этом не прихватить лишнего (Например остатки номенклатуры по количеству и сумме из внешнего источника), При этом нужно избегать ситуации, когда остаются копейки без количества (т.е. ошибки из-за округлений). С перебором подобные задачи на ура решаюся с помощью методов НайтиСтроки (Для таблицы значений) и НайтиСледующий(Для Выборки). Запросом к сожалению решить не удавалось. Сейчас пришел к тому, что многоие задачи распределения подлежат унификации.
41. Ish_2 1052 31.01.17 13:44 Сейчас в теме
(40)
Запросом к сожалению решить не удавалось.

"Фифо для любопытных"
http://infostart.ru/public/68225/
42. OPM 219 01.02.17 18:53 Сейчас в теме
(40) Посмотри в 1С:Бухгалтерии распределение 25 счета по 20 в регламентной операции, делается только запросами, и погрешностей округления нет.
44. Гость 19.03.17 14:25
Есть задача из универа:
Есть фура объемом 50 000т. Ее нужно загрузить так , чтобы Суммарная стоимость товара, перевозимого фурой, должна быть максимальной.

Результат должен быть такой:
код партии вес Стоимость
101 10 000 700 000
302 4 000 240 000
601 24 000 2 160 000
602 11 000 990 000

Пробую методом из статьи:


ВЫБРАТЬ
    "A" КАК Фура,
    50000 КАК Объем
ПОМЕСТИТЬ Фуры
;

////////////////////////////////////////////////////////////­////////////////////

ВЫБРАТЬ
    "101" КАК Партия,
    10000 КАК Вес,
    700000 КАК Стоимость
ПОМЕСТИТЬ Партии

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

ВЫБРАТЬ
    "201",
    12000,
    540000

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

ВЫБРАТЬ
    "301",
    14000,
    840000

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

ВЫБРАТЬ
    "302",
    4000,
    240000

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

ВЫБРАТЬ
    "401",
    8000,
    640000

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

ВЫБРАТЬ
    "501",
    16000,
    880000

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

ВЫБРАТЬ
    "601",
    24000,
    2160000

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

ВЫБРАТЬ
    "602",
    11000,
    990000

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

ВЫБРАТЬ
    "701",
    10000,
    400000

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

ВЫБРАТЬ
    "801",
    18000,
    630000
;

////////////////////////////////////////////////////////////­////////////////////

ВЫБРАТЬ
    Фуры.Фура КАК Фура,
    Фуры.Объем КАК Объем,
    ЕСТЬNULL(СУММА(Фуры1.Объем), 0) + 1 КАК ПорядокРаспределенияС,
    ЕСТЬNULL(СУММА(Фуры1.Объем), 0) + Фуры.Объем КАК ПорядокРаспределенияПо
ПОМЕСТИТЬ ФурыПоПорядку
ИЗ
    Фуры КАК Фуры
        ЛЕВОЕ СОЕДИНЕНИЕ Фуры КАК Фуры1
        ПО Фуры.Фура > Фуры1.Фура

СГРУППИРОВАТЬ ПО
    Фуры.Фура,
    Фуры.Объем
;

////////////////////////////////////////////////////////////­////////////////////

ВЫБРАТЬ
    Партии.Партия КАК Партия,
    Партии.Вес КАК Вес,
    Партии.Стоимость КАК Стоимость,
    ЕСТЬNULL(СУММА(Партии1.Вес), 0) + 1 КАК ПорядокРаспределенияС,
    ЕСТЬNULL(СУММА(Партии1.Вес), 0) + Партии.Вес КАК ПорядокРаспределенияПо
ПОМЕСТИТЬ ПартииПоПорядку
ИЗ
    Партии КАК Партии
        ЛЕВОЕ СОЕДИНЕНИЕ Партии КАК Партии1
        ПО Партии.Стоимость < Партии1.Стоимость

СГРУППИРОВАТЬ ПО
    Партии.Партия,
    Партии.Вес,
    Партии.Стоимость
;

////////////////////////////////////////////////////////////­////////////////////

ВЫБРАТЬ
    ФурыПоПорядку.Фура КАК Фура,
    ПартииПоПорядку.Партия КАК Партия,
    ВЫБОР
        КОГДА ПартииПоПорядку.ПорядокРаспределенияПо < ФурыПоПорядку.ПорядокРаспределенияПо
            ТОГДА ПартииПоПорядку.ПорядокРаспределенияПо
        ИНАЧЕ ФурыПоПорядку.ПорядокРаспределенияПо
    КОНЕЦ - ВЫБОР
        КОГДА ПартииПоПорядку.ПорядокРаспределенияС > ФурыПоПорядку.ПорядокРаспределенияС
            ТОГДА ПартииПоПорядку.ПорядокРаспределенияС
        ИНАЧЕ ФурыПоПорядку.ПорядокРаспределенияС
    КОНЕЦ + 1 КАК Вес,
    ПартииПоПорядку.Стоимость КАК Стоимость,
    ПартииПоПорядку.ПорядокРаспределенияПо,
    ФурыПоПорядку.ПорядокРаспределенияПо КАК ПорядокРаспределенияПо1,
    ПартииПоПорядку.ПорядокРаспределенияС,
    ФурыПоПорядку.ПорядокРаспределенияС КАК ПорядокРаспределенияС1
ИЗ
    ФурыПоПорядку КАК ФурыПоПорядку
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПартииПоПорядку КАК ПартииПоПорядку
    ПО ФурыПоПорядку.ПорядокРаспределенияС <= ПартииПоПорядку.ПорядокРаспределенияПо
            И ФурыПоПорядку.ПорядокРаспределенияПо >= ПартииПоПорядку.ПорядокРаспределенияС
Показать


Результат получается такой:
Партия Вес Стоимость
601 24 000 2 160 000
602 11 000 990 000
501 15 000 880 000

Подскажите, как изменить условия, чтобы получалась максимальная загрузка по стоимости.
45. vpkon 14.06.17 12:47 Сейчас в теме
Спасибо, Александр!
Ваш код не очевиден. И тем ценен. Можно сказать, что вначале своей статьи вы описали инсайт (То есть, как на самом деле люди делают открытия - получают новое знание).
А спасибо, потому что Вы решили просто сложную задачу и поделились с нами.
46. Tracerdim 5 07.11.17 18:01 Сейчас в теме
Большое спасибо за статью. Раньше я, как раз, распределял одну таблицу на другую через нарастающий итог и всякие условия.
После наглядного представления с порядком распределения теперь проще распределять таблицы.
47. Xershi 978 11.11.19 14:03 Сейчас в теме
Нужно сделать распределение с нужным порядком.
Меня запутало слово порядок в вашем запросе!
Недавно решал похожую задачу:
https://infostart.ru/public/68225/
Вот здесь корректный пример запроса для распределения по ФИФО.
У вас не порядок, а метод ФИФО.
Правила для распределения я не нашел.

У меня задача такая.
Есть таблица 1 колонки ячейка, номенклатура, характеристика, назначение, упаковка, количество
Есть таблица 2 колонки ячейка, номенклатура, упаковка, количество.
И нужно распределить итоги таблицы 2, по данным таблицы 1 с нужным порядком. В частности ФИФО, но с оговоркой.
ФИФО по характеристике, но приоритет над назначением.
Как приоритет делать?
48. Xershi 978 11.11.19 15:07 Сейчас в теме
(47) для примера сделал такой запрос:
ВЫБРАТЬ
	ПересчетТоваровТовары.НомерСтроки КАК НомерСтроки,
	ПересчетТоваровТовары.Ячейка КАК Ячейка,
	ПересчетТоваровТовары.Номенклатура КАК Номенклатура,
	ПересчетТоваровТовары.Упаковка КАК Упаковка,
	ПересчетТоваровТовары.Характеристика КАК Характеристика,
	ПересчетТоваровТовары.Назначение КАК Назначение,
	ПересчетТоваровТовары.КоличествоУпаковок КАК КоличествоУпаковок
ПОМЕСТИТЬ втТовары
ИЗ
	Документ.ПересчетТоваров.Товары КАК ПересчетТоваровТовары
ГДЕ
	ПересчетТоваровТовары.Ссылка = &Документ
;

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

СГРУППИРОВАТЬ ПО
	втТовары.НомерСтроки,
	втТовары.Ячейка,
	втТовары.Номенклатура,
	втТовары.Упаковка,
	втТовары.Характеристика,
	втТовары.Назначение,
	втТовары.КоличествоУпаковок
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПересчетТоваровТовары.Ячейка КАК Ячейка,
	ПересчетТоваровТовары.Номенклатура КАК Номенклатура,
	ПересчетТоваровТовары.Упаковка КАК Упаковка,
	СУММА(ПересчетТоваровТовары.КоличествоУпаковок) - 1 КАК КоличествоУпаковок
ПОМЕСТИТЬ втТоварыТСД
ИЗ
	Документ.ПересчетТоваров.Товары КАК ПересчетТоваровТовары
ГДЕ
	ПересчетТоваровТовары.Ссылка = &Документ

СГРУППИРОВАТЬ ПО
	ПересчетТоваровТовары.Ячейка,
	ПересчетТоваровТовары.Номенклатура,
	ПересчетТоваровТовары.Упаковка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втТоварыИтог.НомерСтроки КАК НомерСтроки,
	втТоварыИтог.Ячейка КАК Ячейка,
	втТоварыИтог.Номенклатура КАК Номенклатура,
	втТоварыИтог.Упаковка КАК Упаковка,
	втТоварыИтог.Характеристика КАК Характеристика,
	втТоварыИтог.Назначение КАК Назначение,
	втТоварыИтог.КоличествоУпаковок КАК КоличествоУпаковок,
	втТоварыИтог.КоличествоУпаковокДо КАК КоличествоУпаковокДо,
	втТоварыИтог.КоличествоУпаковокПосле КАК КоличествоУпаковокПосле,
	втТоварыТСД.КоличествоУпаковок КАК КоличествоУпаковок1,
	ВЫБОР
		КОГДА втТоварыТСД.КоличествоУпаковок < втТоварыИтог.КоличествоУпаковокПосле
			ТОГДА втТоварыТСД.КоличествоУпаковок
		ИНАЧЕ втТоварыИтог.КоличествоУпаковокПосле
	КОНЕЦ - ВЫБОР
		КОГДА 0 > втТоварыИтог.КоличествоУпаковокДо
			ТОГДА 0
		ИНАЧЕ втТоварыИтог.КоличествоУпаковокДо
	КОНЕЦ КАК КоличествоУпаковокФакт
ИЗ
	втТоварыИтог КАК втТоварыИтог
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ втТоварыТСД КАК втТоварыТСД
		ПО втТоварыИтог.Ячейка = втТоварыТСД.Ячейка
			И втТоварыИтог.Номенклатура = втТоварыТСД.Номенклатура
			И втТоварыИтог.Упаковка = втТоварыТСД.Упаковка
			И (втТоварыИтог.КоличествоУпаковокПосле > 0)
			И втТоварыИтог.КоличествоУпаковокДо < втТоварыТСД.КоличествоУпаковок
Показать

Берем в УТ документ пересчет товара (втТовары). В ТСД попадают обрезанные данные (втТоварыТСД). Для эмуляции действий пользователя уменьшил количество на 1.
Просто распределение я получил.
Ключевой момент был, что в приведенной ссылке используется внутреннее соединение, а оно в нашем случае ничего не вернет. Поэтому пришлось переписать как у вас на левое! Плюс у вас идет прибавление к результату до 1, чего делать не нужно. В итоговом запросе просто надо изменить сравнение с больше равно на больше!
И стоит вопрос как свой порядок настроить, чтобы сначала заполнялись характеристики, которые пришли раньше. Если заполнено назначение, то в первую очередь покрывалось оно и тоже по дате заказа.
Могу привести пример таблички, как есть и как хочется видеть порядок.
49. Xershi 978 11.11.19 17:50 Сейчас в теме
(48) затем возникла вторая проблема ТСД может указать количество меньше, чем количество на 2 партии (2 строки), тогда идет обрезание. Переписал итоговый запрос на левое и вставил проверку на нуль, чтобы оставить не заполненную строку.
Далее возникла проблема когда ТСД возвращает количество больше чем в документе. Оно просто пропадало. Для этого придумал финт через ВТ посчитал максимум таких позиций добавил в первую таблицу этот итог. И затем в конце сравнивал чтобы значение после и итог были равны, тогда в последнюю строку все добавляло.
Проблему с порядком так и не решил.
Пока придумал костыль. Сортировать таблицу 1 до попадания в запрос, тогда получится нужный порядок!
Вот что вышло:
ВЫБРАТЬ
	ПересчетТоваровТовары.НомерСтроки КАК НомерСтроки,
	ПересчетТоваровТовары.Ячейка КАК Ячейка,
	ПересчетТоваровТовары.Номенклатура КАК Номенклатура,
	ПересчетТоваровТовары.Упаковка КАК Упаковка,
	ПересчетТоваровТовары.Характеристика КАК Характеристика,
	ПересчетТоваровТовары.Назначение КАК Назначение,
	ПересчетТоваровТовары.КоличествоУпаковок КАК КоличествоУпаковок
ПОМЕСТИТЬ втТовары
ИЗ
	Документ.ПересчетТоваров.Товары КАК ПересчетТоваровТовары
ГДЕ
	ПересчетТоваровТовары.Ссылка = &Документ
;

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

СГРУППИРОВАТЬ ПО
	втТовары.НомерСтроки,
	втТовары.Ячейка,
	втТовары.Номенклатура,
	втТовары.Упаковка,
	втТовары.Характеристика,
	втТовары.Назначение,
	втТовары.КоличествоУпаковок
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПересчетТоваровТовары.Ячейка КАК Ячейка,
	ПересчетТоваровТовары.Номенклатура КАК Номенклатура,
	ПересчетТоваровТовары.Упаковка КАК Упаковка,
	СУММА(ПересчетТоваровТовары.КоличествоУпаковок) КАК КоличествоУпаковок
ПОМЕСТИТЬ втТоварыТСД
ИЗ
	Документ.ПересчетТоваров.Товары КАК ПересчетТоваровТовары
ГДЕ
	ПересчетТоваровТовары.Ссылка = &Документ

СГРУППИРОВАТЬ ПО
	ПересчетТоваровТовары.Ячейка,
	ПересчетТоваровТовары.Номенклатура,
	ПересчетТоваровТовары.Упаковка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втТоварыТСД.Ячейка КАК Ячейка,
	втТоварыТСД.Номенклатура КАК Номенклатура,
	втТоварыТСД.Упаковка КАК Упаковка,
	втТоварыТСД.КоличествоУпаковок + 1 КАК КоличествоУпаковок
ПОМЕСТИТЬ втТоварыТСДИтог
ИЗ
	втТоварыТСД КАК втТоварыТСД
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втТоварыИтог.НомерСтроки КАК НомерСтроки,
	втТоварыИтог.Ячейка КАК Ячейка,
	втТоварыИтог.Номенклатура КАК Номенклатура,
	втТоварыИтог.Упаковка КАК Упаковка,
	втТоварыИтог.Характеристика КАК Характеристика,
	втТоварыИтог.Назначение КАК Назначение,
	втТоварыИтог.КоличествоУпаковок КАК КоличествоУпаковок,
	втТоварыИтог.КоличествоУпаковокДо КАК КоличествоУпаковокДо,
	втТоварыИтог.КоличествоУпаковокПосле КАК КоличествоУпаковокПосле,
	втТоварыТСД.КоличествоУпаковок КАК КоличествоУпаковокМаксимум
ПОМЕСТИТЬ втТоварыИтогПолная
ИЗ
	втТоварыИтог КАК втТоварыИтог
		ЛЕВОЕ СОЕДИНЕНИЕ втТоварыТСД КАК втТоварыТСД
		ПО втТоварыИтог.Ячейка = втТоварыТСД.Ячейка
			И втТоварыИтог.Номенклатура = втТоварыТСД.Номенклатура
			И втТоварыИтог.Упаковка = втТоварыТСД.Упаковка

СГРУППИРОВАТЬ ПО
	втТоварыИтог.НомерСтроки,
	втТоварыИтог.Ячейка,
	втТоварыИтог.Номенклатура,
	втТоварыИтог.Упаковка,
	втТоварыИтог.Характеристика,
	втТоварыИтог.Назначение,
	втТоварыИтог.КоличествоУпаковок,
	втТоварыИтог.КоличествоУпаковокДо,
	втТоварыИтог.КоличествоУпаковокПосле,
	втТоварыТСД.КоличествоУпаковок
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втТоварыИтогПолная.НомерСтроки КАК НомерСтроки,
	втТоварыИтогПолная.Ячейка КАК Ячейка,
	втТоварыИтогПолная.Номенклатура КАК Номенклатура,
	втТоварыИтогПолная.Упаковка КАК Упаковка,
	втТоварыИтогПолная.Характеристика КАК Характеристика,
	втТоварыИтогПолная.Назначение КАК Назначение,
	втТоварыИтогПолная.КоличествоУпаковок КАК КоличествоУпаковок,
	втТоварыИтогПолная.КоличествоУпаковокДо КАК КоличествоУпаковокДо,
	втТоварыИтогПолная.КоличествоУпаковокПосле КАК КоличествоУпаковокПосле,
	втТоварыИтогПолная.КоличествоУпаковокМаксимум КАК КоличествоУпаковокМаксимум,
	втТоварыТСДИтог.КоличествоУпаковок КАК КоличествоУпаковокТСД,
	ВЫБОР
		КОГДА втТоварыИтогПолная.КоличествоУпаковокМаксимум = втТоварыИтогПолная.КоличествоУпаковокПосле
				ИЛИ втТоварыТСДИтог.КоличествоУпаковок < втТоварыИтогПолная.КоличествоУпаковокПосле
			ТОГДА втТоварыТСДИтог.КоличествоУпаковок
		ИНАЧЕ втТоварыИтогПолная.КоличествоУпаковокПосле
	КОНЕЦ - ВЫБОР
		КОГДА 0 > втТоварыИтогПолная.КоличествоУпаковокДо
			ТОГДА 0
		ИНАЧЕ втТоварыИтогПолная.КоличествоУпаковокДо
	КОНЕЦ КАК КоличествоУпаковокФакт
ИЗ
	втТоварыИтогПолная КАК втТоварыИтогПолная
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ втТоварыТСДИтог КАК втТоварыТСДИтог
		ПО втТоварыИтогПолная.Ячейка = втТоварыТСДИтог.Ячейка
			И втТоварыИтогПолная.Номенклатура = втТоварыТСДИтог.Номенклатура
			И втТоварыИтогПолная.Упаковка = втТоварыТСДИтог.Упаковка
			И (втТоварыИтогПолная.КоличествоУпаковокПосле > 0)
			И втТоварыИтогПолная.КоличествоУпаковокДо < втТоварыТСДИтог.КоличествоУпаковок
Показать

Поменял - на +, чтобы эмулировать избыток товара.
Оставьте свое сообщение

См. также

GGraphics - внешняя компонента для работы с картинками jpg (jpeg), png, bmp, gif, tif Промо

Разработка внешних компонент v8 1cv8.cf Платные (руб)

Позволяет автоматизировать работу с картинками. С помощью компоненты можно измерять размер изображений, поворачивать их, наносить водяные знаки, конвертировать из одного формата в другой. Будет очень полезна для интернет-магазинов и всех, кому постоянно требуется работать с различными графическими форматами. Выполнена по технологии NativeAPI. Работает с форматами: jpg (jpeg), png, bmp, gif, tif

2000 руб.

02.09.2010    54279    62    207    

Интеграция "Библиотеки интеграции МДЛП 1.1.2.7" с типовой конфигурацией

Интеграция Конфигурирование 1С v8 Здравоохранение, медицина, стоматология Россия Бесплатно (free)

Инструкция для интеграции “Библиотеки интеграции МДЛП 1.1.2.7” в типовые конфигурации, на примере конфигурации “Управление нашей фирмой, редакция 1.6 (1.6.18.168)”.

02.03.2020    4220    0    RPGrigorev    3    

Универсальные инструменты 1С

Универсальные обработки Прочие инструменты разработчика v8 1cv8.cf Бесплатно (free)

Свободно распространяемый набор универсальных обработок и отчетов в виде расширения для разработки и поддержки, которое работает во ВСЕХ видах клиентских приложений и во всех операционных системах, которые поддерживает платформа 1С:Предприятие, кроме мобильных. Консоль запросов - консоль отчетов - консоль кода - редактор объектов базы данных - удаление помеченных объектов - поиск и удаление дублей - редактор констант - консоль заданий - групповая обработка справочников и документов - динамический список - поиск ссылок на объект - регистрация изменений для обмена данными - структура хранения базы - консоль HTTP запросов-консоль вебсервисов- консоль сравнения данных- информация о лицензиях- загрузка из табличного документа-файловый менеджер-все функции- навигатор по конфигурации-конструктор регулярных выражений-Выгрузка загрузка XML с фильтрами

21.01.2020    21182    295    cprit    94    

Хранение файлов - как уменьшить размер базы данных

Чистка базы Производительность и оптимизация (HighLoad) Практика программирования Разработка v8 Россия Бесплатно (free)

Хранение файлов в базе 1С можно оптимизировать для уменьшения размера хранимых данных.

09.09.2019    7910    0    2tvad    17    

Коннектор: удобный HTTP-клиент для 1С:Предприятие 8 Промо

Практика программирования Внешние источники данных WEB Универсальные функции Инструментарий разработчика Универсальные обработки v8 1cv8.cf Платные (руб)

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

2000 руб.

31.01.2019    45476    326    156    

1С:Ассемблер. Немного летнего веселья!

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

Все вы, наверное, слышали, что 1С-ники жалуются на свою систему, считая язык 1С недостаточно низкоуровневым, скучным и т.п. Все они с тоской поглядывают в сторону "настоящих" языков программирования. Так вот, господа, они неправы. В системе 1С есть места, где можно размять программерский мозг и получить удовольствие от низкоуровневой техники. Предлагаю вам погрузиться в недра виртуальной машины 1С и понять, как она работает. Там есть свой "ассемблер" и мы попробуем его в действии!

1 стартмани

21.06.2019    26236    76    Evil Beaver    119    

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

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

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

11.05.2019    26328    0    Eret1k    23    

Немного о графических файлах. Сжатие. Распознавание текста

Инструментарий разработчика v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

06.05.2019    6676    10    tusv    6    

Регулярные выражения без внешних компонент? Легко! Промо

Практика программирования Обмен через XML v8 Бесплатно (free)

Сложный способ организовать проверку строки с помощью регулярного выражения в 1С. При этом ни одна внешняя компонента не пострадала. Ну и от платформы (Linux, MustDie) - не зависит.

04.03.2016    60178    0    starik-2005    99    

Практика перехода на Linux и Postgres в небольшой компании (10 пользователей)

Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

Почему я решил поставить давнему клиенту Linux + Postgres вместо Windows + MS SQL? Что меня останавливало раньше?

22.04.2019    27761    0    starik-2005    169    

HTML-клиент у конфигурации 1С

WEB v8 Бесплатно (free)

Приветствую. В этой публикации опишу свой опыт создания html-клиента для конфигурации 1С с помощью http-сервисов. HTML-клиент в этом случае - это frontend (html + css+ js), который генерирует и выдает пользователю конфигурация + backend, который тоже реализован в этой же конфигурации.

17.04.2019    16851    0    Smaylukk    119    

Уменьшаем трафик: HTTP запрос со сжатием GZIP средствами 1С. На примере выгрузки файлов на Яндекс-диск

WEB v8 1cv8.cf Абонемент ($m)

Обработка демонстрирует отправку тела HTTP запроса со сжатием gzip (метод deflate) средствами платформы 1С. Демонстрация происходит на примере отправки текста или файла на Яндекс.Диск.

1 стартмани

03.09.2018    5831    28    uno-c    0    

Инструменты бухгалтера: Виджеты рабочего стола Промо

Универсальные обработки Рабочее место v8 v8::БУ БП3.0 Абонемент ($m)

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

2 стартмани

28.08.2017    35291    170    Bazil    28    

Чтение сжатого gzip, deflate HTTP ответа сервера. Без ВК. Уменьши время загрузки и сократи трафик в 3 раза

WEB v8 1cv8.cf Абонемент ($m)

В платформе 1С:Предприятие не реализовано штатного механизма декодирования ответа веб серверов, в которых присутствует gzip сжатие. Некоторые использовали WinHttpRequest.5.1 , кто-то писал ВК. Друзья, хватит. Вот вам решение.

1 стартмани

08.06.2018    13594    69    Malfarion    16    

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

Обработка документов Обработка справочников Практика программирования v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

03.05.2018    44729    116    Mirage78    15    

Обработка печатной формы WORD клиент-сервер УФ

Универсальные печатные формы v8::УФ 1cv8.cf Абонемент ($m)

Это моя первая статья на данном портале, но попытаюсь изложить все понятно и подробно. Долгое время у меня заняло создание такой вот внешней обработки. Есть очень много примеров, как сделать подобное на неуправляемых формах (2.0) и очень мало информации касательно управляемых(3.0), по крайней мере я многого найти не смог в доступе. Создание подобное обработки выглядит вполне несложно, если производить все действия на сервере, как это было с 2.0, но в нашем случае необходимо инициализировать открытие документа на клиенте, чему сильно мешает отсутствие возможности передать макет Active Document с сервера на клиент.

2 стартмани

14.03.2018    23691    83    LeoKeyn    41    

Gant 1C 2.* - диаграмма Ганта с таблицей + Планировщик + Отчет (8.1, на управляемой форме/Такси 8.2, 8.3) Промо

Рабочее место Универсальные обработки Управление проектом Финансовый учет и бюджетирование (FRP) Производство готовой продукции (работ, услуг) Учет рабочего времени Финансовый учет и бюджетирование (FRP) Производство готовой продукции (работ, услуг) Учет рабочего времени v8 1cv8.cf УУ Абонемент ($m)

Внешняя обработка, аналог MS Project в 1Се для работы с задачами: параллельный ввод данных по задачам и график Ганта, дополнительный режим в виде календаря (планировщик), связывание задач и пересчет длительности и дат с учетом выходных, видов связей и запаздываний, расчет затрат, сохранение/открытие проектов в файл на диск или файл ИБ, импорт/экспорт документов Microsoft Project.

1 стартмани

02.12.2011    135865    1068    rare-avis    210    

“Заставим сканер пищать!” или Получаем обратную связь из 1С при сканировании штрихкодов

Сканер штрих-кода Учет ТМЦ Учет ТМЦ v8 1cv8.cf Абонемент ($m)

Получаем обратную связь из 1С при сканировании штрихкодов.

1 стартмани

10.01.2018    40580    100    vadnevzorov    70    

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

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

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

19.11.2017    181722    0    MaxS    285    

Зачем 1С-нику NoSQL и CRDT

WEB Интеграция Бесплатно (free)

В статье речь пойдет о современных инструментах для хранения, транспорта, обработки и обмена данными на примере популярной NoSQL-базы CouchDB.

12.08.2017    22728    0    unpete    27    

Маркировка: 2D Android Штрихкод сканер + драйвер устройства для 1С Промо

Сканер штрих-кода Розничная торговля Розничная торговля v7.7 v8 1cv8.cf 1cv7.md Абонемент ($m)

Драйвер торгового оборудования и приложение для Android, телефон или планшет в качестве стандартного штрихкод сканера для платформы 1С.

3 стартмани

29.11.2016    43970    176    dreamadv    110    

Как я стал одинэсником и переехал из провинции в Москву

О жизни Россия Бесплатно (free)

История покорения Москвы.

29.07.2017    16819    0    DmitryKSL    132    

54 ФЗ своими руками

ККМ Кассовые операции Розничная торговля Кассовые операции Розничная торговля v8 Розница Розничная и сетевая торговля (FMCG) Россия УУ Бесплатно (free)

Практический опыт внедрения изменений в 54ФЗ в розничной сети, работающей на 1С. Если вы не хотите платить каким-либо подрядчикам, которые "всё сделают и настроят за вас", то статься может оказаться крайне полезной.

17.04.2017    57582    0    comol    124    

Формирование штрихкода EAN-13 в SVG с помощью XDTO

Практика программирования v8 1cv8.cf Россия Абонемент ($m)

В версии платформы 8.3.9 было объявлено о поддержке изображений в формате SVG. Данная обработка демонстрирует работу с данным форматом, а именно его формированием (рисованием). Ну а так как самой популярной картинкой в 1С, наверное, является картинка штрихкода EAN - ее я и решил рисовать.

1 стартмани

24.03.2017    11937    52    kot-stas    19    

Удаление организации из 1С. Чистка базы 1С. Удаление "не удаляемых" объектов Промо

Чистка базы v8 1cv8.cf Абонемент ($m)

Удалить все документы, чтобы в базе осталась только одна организация со своими документами? Удалить всю информацию в регистрах, не связанную с указанной фирмой? Удалить "неудаляемую" номенклатуру? Легко! Используйте эту обработку.

10 стартмани

02.10.2015    51032    309    spy-83    84    

План обмена в формате "EnterpriseData" для 1С 7.7

Обмен через XML 1С7.7<->1C7.7 v7.7 1С7:ТиС Абонемент ($m)

Пример организации надёжной синхронизации данных через универсальный формат "EnterpriseData" между конфигурациями на базе 1С 7.7 и произвольными приложениями.

1 стартмани

07.01.2017    21853    24    binex    23    

"Распределение в запросе" или "избавляемся от перебора"

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

Хороший перебор - это отсутствие перебора. Рассмотрим пример замены полного перебора запросом.

16.12.2016    32714    0    alexandersh    48    

Разбираемся с механизмом Дополнительные отчеты и обработки в БСП

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Чуть более комплексное описание, чем на других ресурсах

1 стартмани

30.10.2016    140222    947    json    66    

Монитор журнала регистрации Промо

Журнал регистрации Администрирование данных 1С WEB v8 1cv8.cf Абонемент ($m)

Позволяет в режиме реального времени отслеживать активность пользователей, накапливать и оповещать о возникновении ошибок, которые попадают в журнал регистрации

2 стартмани

29.06.2015    39837    106    andy23    49    

Редактирование табличной части объекта с помощью СКД

Инструментарий разработчика Практика программирования v8::СКД 1cv8.cf Россия Абонемент ($m)

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

2 стартмани

16.09.2016    24440    96    Hatson    27    

Примеры скриптов на OneScript

OneScript Россия Абонемент ($m)

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

1 стартмани

14.07.2016    28550    41    Drak0n    43    

Набор данных Объект в СКД для решения задач сортировки, нумерации и вывода в отчет произвольных наборов данных

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

Использование набора данных Объект в СКД, может добавить вашему отчету новые интересные возможности. В этой статье я покажу, как я использовал набор данных Объект при решении одной задачи.

04.07.2016    44608    0    lopatin    12    

Опыт оптимизации и контроля производительности в БД с 3000 пользователей Промо

Производительность и оптимизация (HighLoad) Бесплатно (free)

Данная статья написана по материалам доклада, прочитанного на Конференции Инфостарта IE 2014 29-31 октября 2014 года. Меня зовут Сергей, являюсь руководителем отдела оптимизации и производительности систем в компании "Деловые линии". Цель этого доклада – поделиться информацией о нашем опыте работы с большой базой на платформе 1С, с чем пришлось столкнуться, как удалось обеспечить работоспособность. Уверен, что вам будет интересно, так как подобной информацией мало кто делится, да и про само существование таких систем их владельцы стараются не рассказывать, максимум про это «краем глаза» упоминают участвовавшие в проекте вендоры. **update от 04.03.2016 по вопросам из комментариев

05.08.2015    60285    0    Sergey.Noskov    119    

Учет путевых листов

Обработка документов Печатные формы документов Учет рабочего времени Учет ТМЦ Учет рабочего времени Учет ТМЦ v8 v8::УФ 1cv8.cf БУ УУ Абонемент ($m)

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

3 стартмани

27.06.2016    14102    79    DrugOn    10    

Google Analytics API, Oauth2.0 и 1c8

Практика программирования WEB v8 1С:Франчайзи, автоматизация бизнеса Бесплатно (free)

Обращение к Google Analytics API, Протокол Oauth 2.0 и запросы от 1С:8 без авторизации пользователя

02.05.2016    25577    0    Ольга_tmp    18    

УПД для документа "Поступление товаров и услуг" (БП 3.0) за поставщика

Печатные формы документов Оптовая торговля Производство готовой продукции (работ, услуг) Оптовая торговля Производство готовой продукции (работ, услуг) v8 v8::БУ БП3.0 Россия БУ Абонемент ($m)

Внешняя печатная форма для документа "Поступление товаров и услуг" позволяет печатать "Универсальный передаточный документ (УПД)" за поставщика в ред. постановления Правительства РФ 1137, 625 и 981

1 стартмани

20.12.2015    21975    273    romanco    18    

Автоматический REST-сервис в «1С:Предприятии». OData. Пример работы из Jscript/AJAX Промо

Практика программирования WEB v8 1cv8.cf Абонемент ($m)

Небольшой обзор REST-сервиса в «1С:Предприятии». Рассмотрен механизм работы c REST-сервером 1С:Предприятия из внешнего приложения - веб-страницы с использованием языка JavaScript и технологии AJAX.

1 стартмани

08.10.2014    76568    75    vano-ekt    48    

Автозаполнение адресов в 1С (API Google autocomplete place)

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

В данной статье вы увидите пример, как можно с помощью API Google autocomplete place делать подсказки при заполнении адреса

19.10.2015    12895    0    d.alexandr    26    

Использование встроенных отчетов для создания анализа корректности данных при исчислении НДС с авансов полученных

Бухгалтерский учет v8 БП2.0 Россия БУ НДС Бесплатно (free)

На Инфостарте много выложено внешних отчетов, направленных на контроль правильности исчисления НДС с авансов полученных. Хочу поделиться своим опытом использования встроенного отчета (для Бухгалтерия предприятия.Редакция 3.0) и порядка создания настроек отчета для процедур контроля за исчислением НДС с авансовых платежей покупателей, особенно в случаях применения различных налоговых ставок НДС

1 стартмани

22.07.2015    8768    0    lvk74    3    

Дополнительные отчеты и обработки для конфигураций, основанных на БСП. Часть 1. Заполнение объектов.

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

08.01.2015    35018    72    acrk    23    

Создание внешних печатных форм под управляемым приложением с нуля Промо

Печатные формы документов v8 v8::УФ 1cv8.cf Абонемент ($m)

Когда мне пришлось создавать внешние печатные формы под приложения на БСП ("1С: Бухгалтерия предприятия 3.0", "1С: Управление торговлей 11"), я обнаружил, что нет грамотных инструкций. Те, что имелись, использовали так называемые шаблоны: готовые обработки, в которых необходимо выполнять определенные корректировки. Но как создать сам шаблон, конкретных мануалов не было, справочную информацию я нашел на сайте ИТС и, обработав ее, написал статью, где подробно и понятно объясняются все этапы создания внешней печатной формы для управляемого приложения на примере конфигурации "1С: Бухгалтерия предприятия 3.0"

1 стартмани

05.06.2014    263230    391    signum2009    127    

Настройка ТСД chiperLab 8001 для УТ 11

Терминал сбора данных Учет ТМЦ Учет ТМЦ v8 УТ10 УУ Абонемент ($m)

Расширяем функционал ТСД chiperLab 8001 и загружаем сразу 10 документов Сканируйте 10 накладных за один раз!!!

1 стартмани

23.10.2014    24499    21    antonlinux    4    

Работа с принтером чеков Posiflex PP 6000, 7000, 8000

POS терминал Россия Абонемент ($m)

Некоторые варианты для работы с принтером чеков POSIFLEX AURA 6000, 7000, 8000.

1 стартмани

18.08.2014    64629    146    MrFlanker    24    

Подписываем файлы с помощью ЭЦП средствами 1с Промо

Универсальные обработки Защита и шифрование v8 1cv8.cf Абонемент ($m)

Обработка для подписи с помощью сертификата (ЭЦП) произвольных файлов, только средствами платформы 1с. Работает на всех конфигурациях, но только на последних платформах 8.2 и 8.3, где есть менеджер криптографии.

1 стартмани

05.09.2013    60514    255    anig99    25    

1С Бухгалтерия 8. Часть 1: Настройка параметров учета Промо

Управленческий учет (прочее) v8 БП2.0 Россия БУ Бесплатно (free)

Залогом правильного ведения бухгалтерского и налогового учета в программе 1С Бухгалтерия 8 является правильная настройка параметров учета и учетной политики. Разработчики 1С постарались, чтобы эти настройки были простыми и понятными. Тем не менее, есть ряд подводных камней, о которые могут спотыкаться даже опытные пользователи.

05.11.2011    223284    0    vdi1950    124