Решение транспортной задачи запросом

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

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

партии транспортная задача партионный учет

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

Вступление (лирическое)

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

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

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

Дисклеймер

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

То, что вышло - это труд, который, тем не менее, ни на что не претендует. А данная публикация является реализацией моего желания сделать “вклад в общее дело”. Какой он вышел, таким и останется.

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


Часть 1. Теоретические основы

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

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

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

1.1 Списание партий товаров

Первое, что напоминает транспортная задача - это списание партий товаров. Тогда было принято решение прорабатывать проблему в этом направлении.

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

Перейдем к рассмотрению основных принципов.

1.2. Срез последних на каждую дату в запросе

Этот пункт знакомит читателя с идеей соединения таблицы самой с собой.

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

Срез последних на каждую дату в запросе

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

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

1.3 Списание по партиям в запросе (вычисление нарастающего итога)

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

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

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

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

Нарастающий итог полученный в запросе

На рисунке изображена Таблица 1. Это таблица неизрасходованных партий. В системе она, скорее всего, представляет собой таблицу остатков регистра накопления. Таблица 2 - это та же самая таблица неизрасходованных партий. Левым соединением мы соединяем Таблицу 1 с Таблицей 2 по условию Таблица 2.Партия < Таблица 1.Партия. Это означает, что для каждой партии из Таблицы А мы получим те партии из Таблицы Б, которые располагаются выше нее.

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

Теперь осталось только его правильно задействовать.

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

Делается это следующим образом:

  1. логическим выражением

    Минимум(КоличествоПартии, КоличествоТовара - НарастающийИтогПартии)

  2. в терминах языка запросов

    ВЫБОР
       КОГДА
    КоличествоТовара > КоличествоПартии + НарастающийИтогПартии
          ТОГДА КоличествоПартии
       ИНАЧЕ КоличествоТовара - НарастающийИтогПартии
    КОНЕЦ

Разъяснение здесь простое.

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

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

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

Примечание 1. Мы снова рассматриваем решение только для одной товарной позиции, поэтому в соединении таблиц не присутствует условие по товару.

Примечание 2. Сравнение партий по знаку “<” возможно, наверное, всегда. Я не смог придумать случай, когда это сложно сделать. Если партия представлена документом, то их сравнение осуществляется по дате/номеру или моменту времени. Если справочник - то по наименованию или коду. Примитивные типы сортируются вполне очевидно. Выходит, что всегда находится то, что позволяет упорядочить партии в соответствии с тем методом списания партий, который задан учетной политикой (FIFO, LIFO, FEFO или что-то еще).


Часть 2. Постановка задачи и решение

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

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

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

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

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

Естественно, задача должна решаться непосредственно в запросе.

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

2.2 Транспортная задача

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

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

Решение транспортной задачи

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

Решение многомерной транспортной задачи

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

2.3. Таблица пересечений

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

 

Итак, в качестве примера мы имеем таблицу товаров (Таблица 7). Товар (Номенклатура) здесь обозначен как Н1, а номера строк - С1, С2, С3 и т.д. Третьим столбцом имеем количество товара (в нашем случае, в документе), а в четвертом уже рассчитанный нарастающий итог.

В Таблице 8 представлена таблица излишков. Обозначения товаров совпадают. Партии обозначаются П1, П2, П3 и т.д. И также, как и в таблице товаров, уже рассчитан нарастающий итог.

Требуется сформировать некую “карту” распределения строк товаров на строки излишков, чтобы использовать эту таблицу и для выборки излишков, которые были списаны в результате операции приема, и для выборки строк товаров, которые необходимо принять на склад (за минусом излишков, которые уже в наличии).

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

Таблица 9 представляет собой результат соединения Таблицы 7 с Таблицей 8 с добавлением одной единственной колонки, в которой должно быть рассчитано решение.

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

Пришлось применить научный подход к решению.

2.4. Статус строки

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

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

То же самое относится и к строкам таблицы Партий. Мы должны понимать, какой остаток этой партии мы имеем с учетом предыдущих итераций.

Легко заметить, что строки обеих таблиц буду находиться в одном из трех состояний:

  1. Свободная строка - все предшествующие обращения к строке ее не задействовали, либо эта строка рассматривается впервые.
  2. Частично задействованная строка - некоторое количество товара (партии) из данной строки было использовано на одной или несколько предыдущих итерациях.
  3. Полностью израсходованная строка - товара (партии) в данной строке не осталось совсем. На предшествующих итерациях он был израсходован без остатка.

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

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

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

Несмотря на то, что заполнение таблицы не должно вызывать вопросов, небольшое пояснение к данной таблице все-таки не повредит. Для строк товаров и партий, которые израсходованы полностью мы везде проставляем ноль. Это очевидно. Так мы заполняем сразу 5 ячеек. 4 оставшиеся ячейки мы заполняем по формуле Минимум(То, По), то есть берем минимальное из рассчитанных остатков партий и товаров, чтобы не получить отрицательное значение в остатке одной из первоначальных таблиц.

2.5. Вычисление остатка строк

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

Статус строки

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

Новая строка товаров. Для этой строки характерно то, что накопленный итог по товарам превосходит или равен накопленному итогу по партиям, Ни >= Пи (напомню, что накопленный итог не учитывает значение текущей строки). Это значит, что все предыдущие строки товаров разместились в соответствующих строках партий, и текущая строка остается полностью неизрасходованной, потому что партий ей попросту не хватило.

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

Остаток строки товаров в данном случае равен значению количества в текущей строке, Но = Нт.

Частично задействованная строка товаров. Для этой строки характерно обратное неравенство, Ни < Пи. Это значит, что партий было больше, чем строк с товарами, а значит, что из текущей строки мы взяли какое-то количество. Но как вычислить это количество?

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

Нетрудно заметить, что Но + Нх = Нт. В таком случае, путем нехитрых преобразований, получаем Но = Нт + Ни - Пи.

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

Строка товаров считается полностью списанной, если накопленная сумма по партиям превосходит или равна по значению сумме товаров в текущей строке и накопленного итога по товарам, Нт + Ни

Это факт просто пояснить на предыдущем примере с весами. Если при помещении на левую сторону текущего количества товаров положение весов не меняется или выравнивается, то строка товаров уже участвовала в распределении предыдущих строк и была полностью списана там, а значит здесь мы должны получить ноль, Но = 0.

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

2.6. Построение формулы

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

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

     Минимум (
         
Но,
          По
     )
.

Попробуем обобщить формулы для вычисления Но.


Результат 1   2 Условие
1) Но = Нт     при условии Ни >= Пи
2) Но = Нт + Ни - Пи при условии Ни < Пи
3) Но = 0     при условии Нт + Ни <= Пи

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

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

      Минимум (Ни - Пи, 0).

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

Результат 1   2 Условие
1) Но = Нт   Минимум (Ни - Пи, 0) при условии Ни >= Пи
2) Но = Нт + Минимум (Ни - Пи, 0) при условии Ни < Пи
3) Но = 0     при условии Нт + Ни 
* Здесь и далее зеленым цветом показаны добавленные фрагменты.

Тогда искомое выражение примет вид, с учетом зеркальности статусов строк,

     Минимум (

          Нт + Минимум (Ни - Пи, 0),

          Пт + Минимум (Пи - Ни, 0)

          )

Обратимся к третьей строке. Преобразуем условие следующим образом:

      Нт + Ни - Пи

Часть выражение Ни - Пи нам уже знакома. Именно она делает все выражение отрицательным. И это отрицательное значение выйдет из под выражения

    Минимум (0, Ни - Пи).

Более того, этого отрицательного значения будет достаточно, чтобы в сумме с Нт снова остаться отрицательным.

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

Результат Выражение
1) Но = Максимум ( Нт + Минимум ( Ни - Пи, 0 ), 0 )
2) Но = Максимум ( Нт + Минимум ( Ни - Пи, 0 ), 0 )
3) Но = Максимум ( Нт + Минимум ( Ни - Пи, 0 ), 0 )

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

     Минимум (
         
Максимум ( Нт + Минимум ( Ни - Пи, 0 ), 0 ),
         
Максимум ( Пт + Минимум ( Пи - Ни, 0 ), 0 )
     )

Далее остается не самое сложное занятие - преобразовать эту формулу в выражение на языке запросов 1С.

     ВЫБОР
        КОГДА
ТаблицаНоменклатуры.ТекущееКоличество + ТаблицаНоменклатуры.Итог <= ТаблицаПартий.Итог
                ИЛИ ТаблицаПартий.ТекущееКоличество + ТаблицаПартий.Итог <= ТаблицаНоменклатуры.Итог
            ТОГДА 0
       
КОГДА ТаблицаНоменклатуры.ТекущееКоличество + ВЫБОР
                КОГДА
ТаблицаНоменклатуры.Итог < ТаблицаПартий.Итог
                    ТОГДА ТаблицаНоменклатуры.Итог - ТаблицаПартий.Итог
                ИНАЧЕ 0
           
КОНЕЦ < ТаблицаПартий.ТекущееКоличество + ВЫБОР
                КОГДА
ТаблицаПартий.Итог < ТаблицаНоменклатуры.Итог
                    ТОГДА ТаблицаПартий.Итог - ТаблицаНоменклатуры.Итог
                ИНАЧЕ 0
           
КОНЕЦ
            ТОГДА
ТаблицаНоменклатуры.ТекущееКоличество + ВЫБОР
                    КОГДА
ТаблицаНоменклатуры.Итог < ТаблицаПартий.Итог
                        ТОГДА ТаблицаНоменклатуры.Итог - ТаблицаПартий.Итог
                    ИНАЧЕ 0
               
КОНЕЦ
        ИНАЧЕ
ТаблицаПартий.ТекущееКоличество + ВЫБОР
                КОГДА
ТаблицаПартий.Итог < ТаблицаНоменклатуры.Итог
                    ТОГДА ТаблицаПартий.Итог - ТаблицаНоменклатуры.Итог
                ИНАЧЕ 0
           
КОНЕЦ
    КОНЕЦ

Возможно, существует и более простое выражение, но я использую это.

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

Часть 3. Анализ результата

3.1 Запрос VS Цикл

Сразу стоит признать, что я не тратил времени на оптимизацию данного алгоритма, а только попытался понять есть ли выигрыш от использования запроса или нет.

Была написана небольшая обработка, которая решает случайно сгенерированную задачу двумя способами и, если позволяет платформа (8.2.17+), выводит затраченное время в миллисекундах. Моя практика запуска этой обработки на файловой и клиент-серверной базах показывает двукратное преимущество запроса перед программной обработкой.

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

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

3.2 Демонстрация возможностей внешней обработки

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

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

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

Табличный документ на четвертой закладке заполняется, только если размерность не более 10, иначе СКД начинает тормозить.

Вот и все!



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

Наименование Файл Версия Размер
ТранспортнаяЗадача.epf

.epf 19,89Kb
30.04.14
31
.epf 19,89Kb 31 Скачать

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

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. ildarovich 7022 30.04.14 20:30 Сейчас в теме
Отличное оформление!

Для полноты картины добавлю пару ссылок:
1)ФИФО для любопытных - описание не такое детальное и наглядное, но задача та же и условие соединения в запросе чуть проще. Кстати, в комментарии http://forum.infostart.ru/forum24/topic32459/message361880/#message361880 к той статье дается оценка быстродействия запросного метода. Она совсем не такая оптимистичная, как в этой статье, но на примере списания остатков заказов этого заметно не будет. Также в комментарии http://forum.infostart.ru/forum24/topic32459/message361861/#message361861 приведен рисунок - ментальная модель, используемая при синтезе запроса. Это два стоящих рядом столбика приходов и расходов, общие отрезки в которых и образуют результат. Двумерная модель транспортной задачи, приведенная в данной статье, очевидно, нагляднее.
2)Еще один взгляд на проблему «жизнь без последовательностей». Часть вторая (практическая) - также говорится об использовании аналогии между списанием по партиям и транспортной задачей, правда для скорости она решается не запросом, а программно. Обратите внимание на скриншоты хода решения задачи - они очень похожи на рисунки из статьи.

Ну и остались вопросы по постановке задачи. Что-то из серии "угадал все буквы, но не смог назвать слова" (это я про себя). Понятно, когда есть несколько заказов и требуется закрыть их одним поступлением. Тогда закрываем их по ФИФО. Например, заполняем товары и количество, затем запускаем обработку заполнения табличной части и она разбивает строки по заказам. То есть запрос в ОЗТЧ? Но почему не свернуть ТЧ по одинаковым товарам перед вызовом ОЗТЧ. Это ведь сам подбор делает (серии?). Как кладовщик решает, что заказа нет? В этом случае оформляет ордер? В какой момент на ордер поступление делается? То есть непонятна роль ордера и причины возникновения строк с одинаковым товаром. Или обработка одним запросом сразу много поступлений обрабатывает? - Разъясните, пожалуйста!
jobkostya1c8; dour-dead; DO_WHILE_LOOP; Артано; igormiro; dark_wolf; DrAku1a; bulpi; Aleks_Antonuk; Redokov; bforce; +11 Ответить
2. bforce 443 02.05.14 00:00 Сейчас в теме
(1), спасибо за отзыв.
Интересные ссылки! Жаль, что они мне не попались в процессе работы над задачей.

В первой статье, действительно, интересное решение и его проще осознать. Я бы добавил туда несколько иллюстраций.
Над оценкой трудоемкости запроса я задумался. Мой перебор далеко не оптимален, у него трудоемкость О(n * m). Да и запросы на стороне SQL, как я понимаю, приводят к полному соединению таблиц, и только потом применению условия (я клоню к тому, что трудоемкость не должна делиться на два n * m / 2) . Пусть даже так, но почему тогда запрос отрабатывает быстрее? На досуге я над этим поработаю.
Это два стоящих рядом столбика приходов и расходов, общие отрезки в которых и образуют результат.

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

По поводу постановки задачи. В статье я немного упростил ее. Возможно, в этом причина вопросов.
Начну с кладовщика. У него свой АРМ. В нем он просто сканирует штрихкод товара и переносит его в табличную часть. По нажатию кнопки "Принять" АРМ делает за него всю работу: анализирует остатки по Заказам поставщику, по Поступлениям товаров и услуг и создает соответствующие документы. Если поступления нет - перед нами излишек (Ордер на излишки), а если есть - обычный товар (Приходный ордер на товары). В целях сохранности товара кладовщик не знает какой документ был создан.

А теперь интересное. Нет никакой ОЗТЧ. Сам запрос в обработке проведения (о, ужас!). Подбор в поступление позволяет выбрать только товары из заказов, пусть, даже, нескольких. Таким образом, эти строки никогда не свернутся.
В момент проведения Поступления мы должны закрыть два взаимосвязанных регистра: +Товары к поступлению (какие товары предстоит принять на складе), -Излишки (какие товары из этого поступления уже находятся на складе). Если мы находим товар в излишках, значит, в Товары к поступлению мы его не пишем.

Надеюсь, я не слишком выболтал бизнес-процессы фирмы, и Вам стало яснее.
18. AlexO 129 18.07.14 12:32 Сейчас в теме
(1) (17) так когда будет чектий и конкретный запрос на все эти "графы"?!
Все жду, что вот-вот, создадут идеальный запрос, который можно будет везде использовать без переписывания 2/3.
3. Synoecium 695 06.05.14 09:30 Сейчас в теме
Шикарно оформлено, прям курсовая работа. И задача интересная.
4. Bukaska 133 06.05.14 10:39 Сейчас в теме
Однозначно ставлю +, не перевелись ещё на форуме специалисты)))
5. Гошик54 07.05.14 06:37 Сейчас в теме
Это конечно все интересно. Но мне кажется, что в этом примере нет чистоты эксперимента, а именно:
1. Исходный массив данных. На примере рассматривается не большой массив данных тут и так понятно что прямой перебор справится быстрее SQl (SQL - это как межгалактический челнок, но его нужно разогнать). Было бы интересно посмотреть графики скорости с нарастанием объема обрабатываемых данных до сотен тысяч позицый.
2. Может я и ошибаюсь но в эксперименте данные обрабатываются из виртуальной таблицы значений(из кэша памяти), а не поднимаются с файловой системы. В этом случае прямому перебору данные предоставили прямо на блюдечке.
9. bforce 443 07.05.14 12:52 Сейчас в теме
(5), вы немного все переиначили.
  1. У меня получилось, что запрос отрабатывает быстрее, чем перебор, а не наоборот! В моем примере прямой перебор медленнее. Или вы ведете к тому, что преимущества запроса можно еще больше улучшить?
  2. Исходный массив данных. Об этом я обязательно должен был написать (и думал, что написал). Я не тестировал алгоритм на супер больших объемах. Например, таблица 1000 х 1000 у меня решалась несколько минут. Больше делать не стал.
  3. Здесь вы тоже не верно все истолковали. Для перебора используется таблицы объекта (внешней обработки). Непосредственно в них происходят вычисления. Для запроса же эти таблицы выгружаются в параметры запроса, при выполнении запроса помещаются во временные, и только потом используются для расчета нарастающего итога и дальнейших вычислений.
    То есть, действий запросный метод выполняет больше.
6. human_new 388 07.05.14 08:39 Сейчас в теме
Вот это я понимаю подход! Все с разъяснениями. Подобного рода задачи постоянно приходится решать, например, в ЗУПе когда НДФЛ нужно грамотно перекрыть и не держать остатков по периодам или перекрыть любой отрицательный остаток по регисту положительными остатками по этому же регистру. Но то что это Транспортная задача я даже не задумался.
7. alek111--- 07.05.14 09:15 Сейчас в теме
8. wolfsoft 2422 07.05.14 11:36 Сейчас в теме
Дельный материал доступным языком.
10. bulpi 174 07.05.14 13:11 Сейчас в теме
Поставил + за изложение. Но вот за это :

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

нужно бить линейкой по рукам того, кто придумал (организатора учета) . Сильно, больно и долго.
Это не уменьшает теоретической и методической ценности статьи.
11. rasswet 82 08.05.14 09:47 Сейчас в теме
шикарное оформление, респект!
12. tr75 24.05.14 14:08 Сейчас в теме
13. tr75 24.05.14 14:08 Сейчас в теме
14. oberonm 9 27.05.14 11:05 Сейчас в теме
15. yelena-ppm 1 30.05.14 14:36 Сейчас в теме
Отличное практическое применение элегантной теории :)
16. Abbra 22 17.07.14 23:33 Сейчас в теме
Подскажите, пожалуйста, кто знает, как в примере с курсами валют реализовать на языке запросов следующее: "В третьей группе мы соединяем эти две таблицы по условию ПериодКурса, в результате чего получаем избыточное количество записей. Но достаточно сгруппировать их по дате документа и выбрать максимальное из значений ПериодКурса, как мы получим требуемую таблицу."
17. bforce 443 18.07.14 11:43 Сейчас в теме
(16), вы можете обратиться к статье Срез последних на каждую дату в запросе, там есть то, что нужно.
19. Abbra 22 22.07.14 01:27 Сейчас в теме
(17), спасибо. Из этой статьи я понял как объединить таблицу, содержащую все даты периода с колонкой дат известных остатков, а потом уже объединить с колонкой сумм известных остатков.
у Вас же присоединяются сразу две колонки и я не представляю, что потом с этой таблицей делать, чтобы выделить из нее нужное
20. jobkostya1c8 25.08.14 23:15 Сейчас в теме
Отличная статья. Все для производительности.
21. user1250550 07.02.20 08:37 Сейчас в теме
Интересная статья, хорошо все описано, статья 2014 года, актуальна на сегодняшний день
22. bforce 443 07.02.20 21:42 Сейчас в теме
(21) Отправил ссылку на обработку в личку.
Оставьте свое сообщение

См. также

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

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

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

10.11.2018    32323    0    ids79    40    

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

Математика и алгоритмы Учет ТМЦ v8 1cv8.cf Оптовая торговля, дистрибуция, логистика Россия УУ Бесплатно (free)

Особенности учета партионной системы при наличии двух количественных показателей.

26.03.2020    2874    0    lastcontra    4    

Treemapping — способ визуализации данных древовидной структуры. Карта-схема дерева

Математика и алгоритмы Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

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

18.02.2020    4176    0    randomus    18    

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

Практика программирования Математика и алгоритмы v8 Бесплатно (free)

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

30.12.2019    2854    0    Alxby    23    

Как работает серверный вызов в 1С Промо

Математика и алгоритмы v8::УФ Бесплатно (free)

Клиент-серверная архитектура заложена в платформе изначально — со времен «1С:Предприятие 8.0». Однако при разработке на 8.0 и 8.1 о разделении кода на клиентскую и серверную часть можно было не заботиться, поскольку на клиенте (на толстом клиенте) был доступен тот же функционал, что и на сервере. Всё изменилось с выходом платформы «1С:Предприятие 8.2», когда появился тонкий клиент. Теперь на клиенте доступен один функционал, на сервере — другой. Клиент и сервер «общаются» между собой с помощью серверного вызова. Конечно, это усложнило процесс разработки, но с другой стороны – можно создавать более оптимальные (быстрые) решения, поскольку все сложные задачи выполняются на сервере.

18.11.2017    53483    0    pahich    82    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    24298    0    YPermitin    24    

"Хочу универсально!" [Часть 1]

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

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

02.09.2019    9215    0    SeiOkami    35    

Иерархия без "В ИЕРАРХИИ"

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

Говорится о том, как эффективно представлять иерархию в СУБД, как получать и использовать эти представления при решении задач в запросной технике. Уточняются и дополняются запросы из статьи "Уровни, глубина, прародители, циклы и аналоги запросом" [https://infostart.ru/public/160707/].

22.08.2019    11284    0    ildarovich    19    

Будни автоматизации или "мне нужна программка для 3D упаковки" Промо

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

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

24.03.2014    44374    0    ildarovich    116    

EnterpriseData – часть 3. Загрузка данных, идентификация объектов

Практика программирования Математика и алгоритмы Перенос данных из 1C8 в 1C8 Разработка v8 v8::УФ 1cv8.cf Бесплатно (free)

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

22.08.2019    13435    0    ids79    8    

Обработчики событий при записи объектов. Зачем и что за чем?

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

Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта.... Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов. Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.

25.07.2019    40107    4    AlbinaAAA    27    

Как проводятся документы в типовых конфигурациях от 1С

Математика и алгоритмы Практика программирования Разработка v8::ОУ ERP2 УТ11 Россия УУ Бесплатно (free)

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

24.07.2019    25617    0    skv_79    35    

Приемы обработки больших данных в 1С Промо

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

Рассказ об эффективных приемах организации обработок больших объемов данных на платформе 1С

07.08.2015    65696    0    tormozit    27    

FizzBuzz на 1С. Чем короче, тем веселее. Варианты принимаются...

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

Мне было скучно, я не мог себя заставить написать ничего полезного. И читал статью на Хабре. Потом я читал комментарии, а потом... нет я не ушел смотреть котиков на ютюбе. Я решил сделать несколько решений задачки FizzBuzz на 1С, с целью "чем короче, тем лучше". Прошу сильно не пинать, это просто развлечение для вечера.

24.07.2019    5158    0    vandalsvq    16    

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

Математика и алгоритмы Рефакторинг и качество кода v8 Бесплатно (free)

О SonarQube, АПК, EDT. Какие преимущества дает их использование. Для каких команд подходит.

22.07.2019    15366    0    Stepa86    33    

Что делает "В ИЕРАРХИИ" в запросе?

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

Описание действий платформы 1С при использовании конструкции "В ИЕРАРХИИ" в запросах.

16.07.2019    22286    0    YPermitin    34    

XDTO - это просто Промо

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

С появлением платформы 8.1 фирма “1С” представила механизм, носящий интригующее название XML Data Transfer Objects или, если коротко - XDTO. По традиции, документирование механизма составлял тот, кто хорошо разбирался в вопросе, а стало быть опустил “и так понятные” с его точки зрения моменты. Целью данной статьи (или цикла статей, как получится) стало желание поделиться накопленным опытом. Мне кажется, многие неочевидные вещи в механизме XDTO необходимо осветить получше.

24.12.2012    286188    0    Evil Beaver    173    

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

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

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

25.06.2019    45786    0    ids79    20    

Реализуем Стек, Очередь и Приоритетную очередь в 1С

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

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

24.06.2019    13348    0    RonX01    65    

Организация хранения промежуточных данных

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

Организация хранения промежуточных данных в процедуре сверки.

29.05.2019    3961    0    scientes    1    

Самоучитель языка запросов 1С. Промо

Практика программирования Решение задач на 1С:Специалист Математика и алгоритмы v8 v8::Запросы Бесплатно (free)

Сервис для изучения запросов 1С: "Консоль изучения запросов 1С:Предприятие 8". Теперь и с конструктором запросов!

07.05.2013    108264    0    bpc222    327    

Вычисление 200 тысяч знаков числа pi

Математика и алгоритмы v8 Россия Бесплатно (free)

В статье рассматриваются возможности платформы выполнять сверхточные вычисления без использования сложных алгоритмов и внешних компонент на примере вычисления числа pi.

28.05.2019    7274    0    Oleg_nsk    96    

Регистры накопления. Виртуальные таблицы. Часть №1: Обороты

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

Описание работы платформы 1С:Предприятие 8.2 с виртуальной таблицей "Обороты" регистров накопления.

20.05.2019    24303    0    YPermitin    7    

Даем названия переменным: как префиксы экономят наше время

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

Понятные названия переменных экономят время и силы разработчика : в начале, когда мы даём названия переменным, в процессе развития разработки, когда мы "на лету" понимаем назначение той или иной переменной, в конце, когда мы передаём разработку на поддержку других программистов, сами переходя к новым разработкам

06.05.2019    6358    0    Designer1C    81    

Парсер запросов 1С. Часть 1: Введение, разбор математических выражений Промо

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

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

1 стартмани

04.12.2013    30269    5    juntatalor    49    

Заметки по SQL: Срез последних - аналог запроса

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

В статье описывается создание среза последних данных средствами классического языка запросов. Причем метод построения запроса был разработан еще во времена, когда автор работал с СУБД Oracle 9i и программировал на PL SQL. Основная идея заключается преобразовании запроса с подзапросом, в запрос без подзапроса (в примерах описывается преобразование до двух вложенных подзапросов). Запросы тестировались на реальных базах данных. Платформа - 1С:Предприятие 8.3 (8.3.10.2561).

15.01.2019    10652    0    IVC_goal    7    

Многопоточное восстановление последовательностей

Производительность и оптимизация (HighLoad) Практика программирования Математика и алгоритмы Универсальные функции v8 Бесплатно (free)

Универсальный алгоритм многопоточного фонового восстановления любой последовательности.

05.12.2018    12517    0    _ASZ_    33    

Сервис для изучения методов платформы 1С:Предприятие 8. Бесплатно! Промо

Практика программирования Решение задач на 1С:Специалист Математика и алгоритмы v8 Бесплатно (free)

Бесплатный ON-Line сервис изучения методов платформы 1С:Предприятие 8. Подготовка к аттестации 1С:Специалист on-line! Тестовые задания по различным видам учета! Подсказки для оптимального решения!

27.06.2013    49322    0    bpc222    51    

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

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

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

23.08.2018    36367    0    Rain88    46    

Теорема номер тринадцать

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

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

15.03.2018    11855    0    vasilev2015    24    

"Взлом" теста "1С:Профессионал" методом машинного обучения

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

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

12.03.2018    18671    0    ildarovich    19    

v8: Концепция минимального изменения конфигурации для легкого обновления Промо

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

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

28.01.2013    37597    0    MarSeN    57    

Введение в CI для 1С

Математика и алгоритмы v8 Россия Бесплатно (free)

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

21.11.2017    23000    0    real_MaxA    22    

#Область ВНЕШНИЕ_ВЫЗОВЫ или MVC в 1С, библиотечность и упрощение интеграции кода

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

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

12.10.2017    17521    0    for_sale    58    

Пишем игру Минер. Обработка событий ActiveX в 1С

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

Пример демонстрирует обработку событий генерируемых компонентой ActiveX в 1С.

29.05.2017    14530    0    user621724_Dimav1979    12    

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

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

Данная публикация предназначена для начинающих разработчиков и является продолжением статьи "Обработчики событий при записи объектов. Зачем и что за чем?" (ссылка далее). Содержит пример использования несколько обработчиков событий для решения одной задачи и объясняется почему выбраны именно они.

27.09.2012    193890    0    AlbinaAAA    65    

Как я доступ на kb.1c.ru получал

Решение задач на 1С:Специалист Математика и алгоритмы v8 Россия Бесплатно (free)

kb.1c - база знаний по технологическим вопросам крупных внедрений и не только. В этой базе знаний собираются методики и решения технологических проблем эксплуатации 1с, check-list'ы и инструкции по настройке ПО на серверах. Какие-то из размещенных статей дублируются на ИТС. Когда я искал пути получения доступа к нему я столкнулся с проблемой: мало кто доподлинно знает как получить доступ к нему, не работая у франчайзи 1с. Я опишу путь, который прошёл я, как физическое лицо.

01.05.2017    25674    0    ikekoval    34    

Улучшение стандарта "Структура модуля"

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

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

26.03.2017    14164    0    o.nikolaev    23    

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

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

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

16.12.2016    32767    0    alexandersh    48    

Альтернативные способы работы с XML. Часть 2: Введение в xPath или запросы к XML Промо

Обмен через XML Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

В предыдущей статье "Введение в DOM или объектная модель документа" было описано понятие объектной модели документа (DOM), раскрыты плюсы и минусы использования модели при разборе файлов XML, приведено сравнение с построчным последовательным разбором. Были представлены варианты выборки данных с помощью объекта 1С ДокументDOM. Теперь настало время познакомить читателей с самым, на мой взгляд, интересным способом извлечения данных из XML - при помощи языка запросов xPath.

09.08.2012    41663    0    1cspecialist    13    

Планы обмена. Квитировать или гарантировать?

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

Планы обмена предлагают использовать две стратегии удаления обработанных изменений: квитирование и гарантированная доставка сообщений. Как сделать правильный выбор?

12.12.2016    16800    0    zhichkin    9    

Некоторые принципы оптимизации запросов 1С (+SQL)

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

Разработка нового функционала часто связана с созданием новых таблиц в базе и написанием запросов. Собственно, размышляя о запросах, мы и формируем в голове содержание таблиц, индексы и количество таблиц и индексов. Заранее можно уверенно рассуждать о том, какая нужна архитектура, если задачу удалось понять. На этом этапе важно привлекать свой опыт. Что же делать, если его нет? Как рассуждать о запросах и формате хранения?

17.11.2016    10522    0    ture    40    

Использование git для доработки типовых конфигураций 1С

Математика и алгоритмы v8 Беларусь Украина Россия Бесплатно (free)

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

11.10.2016    204302    0    pumbaE    31    

От Hello world - к защите конфигураций за 1 минуту Промо

Защита и шифрование Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

Вы всегда хотели но боялись создать COM объект? Тогда мы идем к вам! С обычным блокнотом, где будем программировать на c#, и таймером ...

19.05.2012    34400    0    O-Planet    130    

Оптимизация запросов 1С:Предприятие – от теории к практике

Практика программирования Математика и алгоритмы v8 Бесплатно (free)

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

07.10.2016    37125    0    bpc222    20    

Регистры сведений 1С. Как это устроено.

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

Основная идея публикации - собрать в одном месте информацию о внутреннем устройстве такой абстрактной сущности, как "Регистр сведений 1С" и ответить на ряд вопросов: Что происходит при записи регистра в различных режимах? Что такое на самом деле "СрезПервых" и "СрезПоследних"? Как оптимально выбрать структуру регистра? Это та информация, владея которой, начинаешь лучше понимать как это работает и как правильно использовать регистры сведений.

05.08.2016    180153    0    Sergey.Noskov    156    

Переводим расширения на 8.3.8. Памятка.

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

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

29.07.2016    46457    0    mrXoxot    12    

Новые функции СКД 8.2.14 Промо

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

Демонстрация новых функций СКД 8.2.14

29.06.2011    214159    0    fishca    51    

Подобие Объектно-ориентированного программирования в 1С (ПООПс)

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

Статья для тех кто знаком с ООП и опустил руки.

24.07.2016    12252    0    adam26    54    

Опыт практического применения методики BDD на 1С. Написание сценариев

Математика и алгоритмы Практика программирования Vanessa Automation v8 Бесплатно (free)

Эта статья открывает цикл публикаций, в которых я хочу поделиться опытом использования методики BDD при разработке на 1С. В этой статье речь пойдёт о написании сценариев.

03.07.2016    22968    0    oleynik.dv    131