Теорема номер тринадцать
Разработка - Математика и алгоритмы
Предисловие
Один из приемов оптимизации запросов - замена соединения на объединение. Например, в СУБД Postgres полное соединение может вызвать тормоза. Тем не менее, не будем обсуждать преимущества и недостатки такого приема - применение зависит от конкретной ситуации. Проблема в том, что не всегда очевидно, когда можно выполнить такое преобразование без изменения результата запроса. Работать на авось, заметать грязь под ковер - не наши методы )). Укажем условия, когда два запроса будут эквивалентны, то есть результаты запросов будут совпадать для всех наборов данных - замена будет возможна. Доказательство теоремы будет проведено методом математической индукции для множеств конечной меры. Алгоритмы полного соединения, объединения, группировки хотя и имеют машинную реализацию, но прозрачны для пользователя. Поэтому метод математической индукции вполне уместен. Думаю, аналогичный результат известен в курсе реляционной алгебры, но ссылку найти не могу. Буду благодарен, если кто покажет. Если найдете ошибку в доказательстве — буду благодарен вдвойне.
Определим переменные
ТаблицаА — источник данных (таблица), содержит колонки КлючА, ПолеА.
ТаблицаБ — источник данных (таблица), содержит колонки КлючБ, ПолеБ.
Запрос1 = Новый Запрос;
Запрос1.Текст =
"ВЫБРАТЬ
ЕСТЬNULL(ТаблицаА.КлючА, ТаблицаБ.КлючБ) КАК Ключ,
ТаблицаА.КлючА,
ТаблицаА.ПолеА,
ТаблицаБ.КлючБ,
ТаблицаБ.ПолеБ
ИЗ
ТаблицаА КАК ТаблицаА
ПОЛНОЕ СОЕДИНЕНИЕ ТаблицаБ КАК ТаблицаБ
ПО ТаблицаА.КлючА = ТаблицаБ.КлючБ";
////////////////////////////////////////////////////////////////////////
Запрос2 = Новый Запрос;
Запрос2.Текст =
"ВЫБРАТЬ
ВложеннаяТаблица2.Ключ,
МАКСИМУМ(ВложеннаяТаблица2.КлючА) КАК КлючА,
МАКСИМУМ(ВложеннаяТаблица2.ПолеА) КАК ПолеА,
МАКСИМУМ(ВложеннаяТаблица2.КлючБ) КАК КлючБ,
МАКСИМУМ(ВложеннаяТаблица2.ПолеБ) КАК ПолеБ
ИЗ
(ВЫБРАТЬ
ТаблицаА.КлючА КАК Ключ,
ТаблицаА.КлючА КАК КлючА,
NULL КАК КлючБ,
ТаблицаА.ПолеА КАК ПолеА,
NULL КАК ПолеБ
ИЗ
ТаблицаА КАК ТаблицаА
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТаблицаБ.КлючБ,
NULL,
ТаблицаБ.КлючБ,
NULL,
ТаблицаБ.ПолеБ
ИЗ
ТаблицаБ КАК ТаблицаБ) КАК ВложеннаяТаблица2
СГРУППИРОВАТЬ ПО
ВложеннаяТаблица2.Ключ";
Теорема
Пусть выполняются условия:
- ТаблицаА не содержит повторений по полю КлючА
- ТаблицаА не содержит в поле КлючА значений NULL
- ТаблицаБ не содержит повторений по полю КлючБ
- ТаблицаБ не содержит в поле КлючБ значений NULL
Тогда Запрос1 эквивалентен Запрос2. Результаты запросов совпадают для всех наборов данных.
Примечание 1
Колонки КлючА, ПолеА, КлючБ, ПолеБ могут быть ссылочного или примитивного типа. Для ключевых полей исключены типы по которым невозможна сортировка или соединение - например строка неограниченной длины.
Примечание 2
Если поля — числовые, то можно использовать агрегатную функцию суммы, вместо Null для пустых полей таких столбцов устанавливать 0. При этом надо помнить, что агрегатные функции Сумма, Максимум «игнорируют» поля типа Null, возвращая результат так, как будто полей Null нет, хотя (Число+Null ) IS Null.
Примечание 3
Колонки могут сами состоять из нескольких колонок, то есть теорема распространяется на источники данных с многими колонками: Ключ1А, Ключ2А, … КлючXА, Поле1А, Поле2А, … ПолеYА.
Примечание 4
Выражение ЕСТЬNULL(ТаблицаА.КлючА, ТаблицаБ.КлючБ) будет равно либо ТаблицаА.КлючА, при ТаблицаБ.КлючБ IS NULL, либо ТаблицаБ.КлючБ, при ТаблицаА.КлючА IS NULL, либо ТаблицаА.КлючА = ТаблицаБ.КлючБ - поскольку полное соединение происходит по условию равенства. То есть выражение ЕСТЬNULL(ТаблицаА.КлючА, ТаблицаБ.КлючБ) симметрично и совпадает с результатом группировки.
Следствие 1
Пример эквивалентных запросов для внутреннего соединения.
Запрос3 = Новый Запрос;
Запрос3.Текст =
"ВЫБРАТЬ
ЕСТЬNULL(ТаблицаА.КлючА, ТаблицаБ.КлючБ) КАК Ключ,
ТаблицаА.КлючА,
ТаблицаА.ПолеА,
ТаблицаБ.КлючБ,
ТаблицаБ.ПолеБ
ИЗ
ТаблицаА КАК ТаблицаА
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаБ КАК ТаблицаБ
ПО ТаблицаА.КлючА = ТаблицаБ.КлючБ";
////////////////////////////////////////////////////////////////////////
Запрос4 = Новый Запрос;
Запрос4.Текст =
"ВЫБРАТЬ
ВложеннаяТаблица2.Ключ,
МАКСИМУМ(ВложеннаяТаблица2.КлючА) КАК КлючА,
МАКСИМУМ(ВложеннаяТаблица2.ПолеА) КАК ПолеА,
МАКСИМУМ(ВложеннаяТаблица2.КлючБ) КАК КлючБ,
МАКСИМУМ(ВложеннаяТаблица2.ПолеБ) КАК ПолеБ
ИЗ
(ВЫБРАТЬ
ТаблицаА.КлючА КАК Ключ,
ТаблицаА.КлючА КАК КлючА,
NULL КАК КлючБ,
ТаблицаА.ПолеА КАК ПолеА,
NULL КАК ПолеБ,
1 КАК ОграничительА,
0 КАК ОграничительБ
ИЗ
ТаблицаА КАК ТаблицаА
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТаблицаБ.КлючБ,
NULL,
ТаблицаБ.КлючБ,
NULL,
ТаблицаБ.ПолеБ,
0,
1
ИЗ
ТаблицаБ КАК ТаблицаБ) КАК ВложеннаяТаблица2
СГРУППИРОВАТЬ ПО
ВложеннаяТаблица2.Ключ
ИМЕЮЩИЕ
СУММА(ВложеннаяТаблица2.ОграничительА) > 0
И СУММА(ВложеннаяТаблица2.ОграничительБ) > 0";
КОНТРПример 1.
Воспроизведем ситуацию, когда условия теоремы НЕ выполняются — результаты запросов не совпадают.
ТаблицаА содержит две строки (Ключ1А, Поле1А), (Ключ1А, Поле2А)
ТаблицаБ содержит две строки (Ключ1Б, Поле1Б), (Ключ2Б, Поле2Б)
ВЫБРАТЬ
"Ключ1А" КАК КлючА,
"Поле1А" КАК ПолеА
ПОМЕСТИТЬ ТаблицаА
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Ключ1А",
"Поле2А"
;
///////////////////////////////////////////////////////////
ВЫБРАТЬ
"Ключ1Б" КАК КлючБ,
"Поле1Б" КАК ПолеБ
ПОМЕСТИТЬ ТаблицаБ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Ключ2Б",
"Поле2Б"
Результат Запрос1
Ключ |
КлючА |
ПолеА |
КлючБ |
ПолеБ |
Ключ1А |
Ключ1А |
Поле1А |
NULL |
NULL |
Ключ1А |
Ключ1А |
Поле2А |
NULL |
NULL |
Ключ1Б |
NULL |
NULL |
Ключ1Б |
Поле1Б |
Ключ2Б |
NULL |
NULL |
Ключ2Б |
Поле2Б |
Результат Запрос2
Ключ |
КлючА |
ПолеА |
КлючБ |
ПолеБ |
Ключ1А |
Ключ1А |
Поле2А |
NULL |
NULL |
Ключ1Б |
NULL |
NULL |
Ключ1Б |
Поле1Б |
Ключ2Б |
NULL |
NULL |
Ключ2Б |
Поле2Б |
КОНТРПример 2
Воспроизведем ситуацию, когда условия теоремы НЕ выполняются — результаты запросов не совпадают.
ТаблицаА содержит одну строку (NULL, Поле1А)
ТаблицаБ содержит одну строку (NULL, Поле1Б)
ВЫБРАТЬ
NULL КАК КлючА,
"Поле1А" КАК ПолеА
ПОМЕСТИТЬ ТаблицаА
;
///////////////////////////////////////////////////////
ВЫБРАТЬ
NULL КАК КлючБ,
"Поле1Б" КАК ПолеБ
ПОМЕСТИТЬ ТаблицаБ
Результат Запрос1
Ключ |
КлючА |
ПолеА |
КлючБ |
ПолеБ |
NULL |
NULL |
Поле1А |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
Поле1Б |
Результат Запрос2
Ключ |
КлючА |
ПолеА |
КлючБ |
ПолеБ |
NULL |
NULL |
Поле1А |
NULL |
Поле1Б |
Доказательство будем проводить методом математической индукции. На первом шаге проверим утверждение на минимальном числе строк таблиц ТаблицаА, ТаблицаБ. Второй шаг — предположим, что утверждение выполняется для таблиц ТаблицаА, ТаблицаБ в которых содержится X и Y строк соответственно. Третий шаг — используя предположение шага 2 докажем, что утверждение выполняется для таблиц ТаблицаА, ТаблицаБ в которых содержится (X+1) и Y строк соответственно. В случае, если условия симметричны относительно ТаблицаА, ТаблицаБ, на этом доказательство заканчивается. Это хорошо изученный, классический, но трудный для понимания метод.
Шаг первый.
Следует учитывать, что рассматриваемые операции симметричны относительно выборок, поэтому количество вариантов можно сократить.
Вариант 1.
Ключ1А <> Ключ1Б, Ключ2А <> Ключ2Б, Ключ1А <> Ключ2А, Ключ1Б <> Ключ2Б
ТаблицаА, содержит две строки (Ключ1А, Поле1А), (Ключ2А, Поле2А),
ТаблицаБ, содержит две строки (Ключ1Б, Поле1Б), (Ключ2Б, Поле2Б).
Результаты Запрос1, Запрос2 совпадают
Ключ |
КлючА |
ПолеА |
КлючБ |
ПолеБ |
Ключ1А |
Ключ1А |
Поле1А |
NULL |
NULL |
Ключ1Б |
NULL |
NULL |
Ключ1Б |
Поле1Б |
Ключ2А |
Ключ2А |
Поле2А |
NULL |
NULL |
Ключ2Б |
NULL |
NULL |
Ключ2Б |
Поле2Б |
Вариант 2.
Ключ1А = Ключ1Б, Ключ2А <> Ключ2Б, Ключ1А <> Ключ2А, Ключ1Б <> Ключ2Б
ТаблицаА, содержит две строки (Ключ1А, Поле1А), (Ключ2А, Поле2А),
ТаблицаБ, содержит две строки (Ключ1А, Поле1Б), (Ключ2Б, Поле2Б).
Результаты Запрос1, Запрос2 совпадают
Ключ |
КлючА |
ПолеА |
КлючБ |
ПолеБ |
Ключ1А |
Ключ1А |
Поле1А |
Ключ1А |
Поле1Б |
Ключ2А |
Ключ2А |
Поле2А |
NULL |
NULL |
Ключ2Б |
NULL |
NULL |
Ключ2Б |
Поле2Б |
Мы показали, что запросы дают одинаковый результат при выполнении условий теоремы, если таблицы содержат 2 записи. Случай, когда записей меньше двух — рассмотреть несложно, будем этот случай считать очевидным.
Шаг второй.
Пусть теорема выполняется для таблиц ТаблицаА(X записей), ТаблицаБ (Y записей). ТаблицаА не содержит повторений по полю КлючА и ТаблицаБ не содержит повторений по полю КлючБ. Запрос1 и Запрос2 эквивалентны, то есть дают одинаковый результат на всех наборах данных.
ТаблицаА
КлючА |
ПолеА |
Ключ1А |
Поле1А |
… |
... |
КлючXА |
ПолеXА |
ТаблицаБ
КлючБ |
ПолеБ |
Ключ1Б |
Поле1Б |
… |
... |
КлючYБ |
ПолеYБ |
Поскольку для выборки порядок строк не важен, мысленно переместим строки внутри выборки так, чтобы образовалось три группы. При этом первые W значений ключевого поля совпадают: Ключ1А = Ключ1Б, … , КлючWА = КлючWБ. Для остальных значений ключевые поля — отличаются.
Результаты Запрос1, Запрос2 совпадают:
Ключ |
КлючА |
ПолеА |
КлючБ |
ПолеБ |
Ключ1А |
Ключ1А |
Поле1А |
Ключ1Б |
Поле1Б |
… |
… |
… |
… |
… |
КлючWА |
КлючWА |
ПолеWА |
КлючWБ |
ПолеWБ |
Ключ(W+1)А |
Ключ(W+1)А |
Поле(W+1)А |
NULL |
NULL |
… |
… |
… |
… |
… |
КлючXА |
КлючXА |
ПолеXА |
NULL |
NULL |
Ключ(W+1)Б |
NULL |
NULL |
Ключ(W+1)Б |
Поле(W+1)Б |
… |
… |
… |
… |
… |
КлючYБ |
NULL |
NULL |
КлючYБ |
ПолеYБ |
Шаг третий.
Добавим в ТаблицаА еще одну строку Ключ(X+1)А, Значение(X+1)А. По условиям теоремы, ТаблицаА не содержит повторений по полю КлючА, то есть все значения поля различные.
Вариант 1.
Среди значений поля КлючБ нет ни одного, равного Ключ(X+1)А.
При расчете результата Запрос1 (Полное соединение) добавится еще одна строка.
Ключ |
КлючА |
ПолеА |
КлючБ |
ПолеБ |
Ключ1А |
Ключ1А |
Поле1А |
Ключ1Б |
Поле1Б |
… |
… |
… |
… |
… |
КлючWА |
КлючWА |
ПолеWА |
КлючWБ |
ПолеWБ |
Ключ(W+1)А |
Ключ(W+1)А |
Поле(W+1)А |
NULL |
NULL |
… |
… |
… |
… |
… |
КлючXА |
КлючXА |
ПолеXА |
NULL |
NULL |
Ключ(X+1)А |
Ключ(X+1)А |
Поле(X+1)А |
NULL |
NULL |
Ключ(W+1)Б |
NULL |
NULL |
Ключ(W+1)Б |
Поле(W+1)Б |
… |
… |
… |
… |
… |
КлючYБ |
NULL |
NULL |
КлючYБ |
ПолеYБ |
При расчете результата Запрос2 — строка добавится в ВложеннаяТаблица2 как Объединение, при группировке эта строка не сгруппируется ни с одной строкой по условиям выше — тоже будет дополнительная строка. Результаты Запрос1, Запрос2 совпадают.
Вариант 2.
В силу требований теоремы значения поля КлючБ различны между собою. Поэтому не может быть случая, когда несколько полей равно Ключ(X+1)А. Однако, одно из значений поля КлючБ может быть равно Ключ(X+1)А. Совпадают (W+1) значений ключевого поля. Запишем результат в таблицу, проверим Запрос1, Запрос2 опираясь на результаты второго шага.
Ключ |
КлючА |
ПолеА |
КлючБ |
ПолеБ |
Ключ1А |
Ключ1А |
Поле1А |
Ключ1Б |
Поле1Б |
… |
… |
… |
… |
… |
КлючWА |
КлючWА |
ПолеWА |
КлючWБ |
ПолеWБ |
Ключ(W+1)А |
Ключ(W+1)А |
Поле(W+1)А |
Ключ(W+1)Б |
Поле(W+1)Б |
Ключ(W+2)А |
Ключ(W+2)А |
Поле(W+2)А |
NULL |
NULL |
… |
… |
… |
… |
… |
Ключ(X+1)А |
Ключ(X+1)А |
Поле(X+1)А |
NULL |
NULL |
Ключ(W+2)Б |
NULL |
NULL |
Ключ(W+2)Б |
Поле(W+2)Б |
… |
… |
… |
… |
… |
КлючYБ |
NULL |
NULL |
КлючYБ |
ПолеYБ |
Результаты Запрос1, Запрос2 совпадают. Что и требовалось доказать.
Надеюсь, что эта теорема позволит нам избежать ошибок при замене левых соединений на объединение и значит — сделать программирование лучше.
Специальные предложения
См. также
[После]Новогодние задачи 5
30.12.2019 1160 Alxby 23
Готовые переносы данных из различных конфигураций 1C Промо
Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.
Регистры бухгалтерии. Общая информация 116
05.09.2019 10370 YPermitin 22
"Хочу универсально!" [Часть 1] 67
02.09.2019 6431 SeiOkami 35
Подборка программ для взаимодействия с ЕГАИС Промо
ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.
Иерархия без "В ИЕРАРХИИ" 123
22.08.2019 6173 ildarovich 18
EnterpriseData – часть 3. Загрузка данных, идентификация объектов 65
22.08.2019 6315 ids79 7
Подборка решений для взаимодействия со ФГИС «Меркурий» Промо
С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.
Обработчики событий при записи объектов. Зачем и что за чем? 247
25.07.2019 19023 4 AlbinaAAA 24
Как проводятся документы в типовых конфигурациях от 1С 167
24.07.2019 19306 skv_79 35
Перенос данных КА 1.1 / УПП 1.3 => БП 3.0 (перенос остатков, документов и справочников из "1С:Комплексная автоматизация 1.1" / УПП 1.3 в "1С:Бухгалтерия 3.0"). Обновлен до версий КА 1.1.115.х, УПП 1.3.130.х! Промо
Разработка позволяет перенести остатки по всем счетам бух.учета в программу "1С:Бухгалтерия предприятия 8", ред. 3.0 на выбранную дату начала ведения учета. Также переносятся документы за период и вся необходимая справочная информация. Правила оперативно обновляю при выходе новых релизов. Рассылка обновлений правил бесплатно в течение 12 месяцев. Есть видеодемонстрация проведения переноса данных. Конфигурации при использовании обмена остаются полностью типовыми. Перенос данных возможен в Бухгалтерию 3.0 версии ПРОФ, КОРП или базовую.
24700 руб.
FizzBuzz на 1С. Чем короче, тем веселее. Варианты принимаются... 8
24.07.2019 3514 vandalsvq 16
Управление качеством кода 144
22.07.2019 10501 Stepa86 33
INFOSTART MEETUP Krasnodar. 14 февраля 2020 г. Промо
Краснодар станет первым в 2020 году местом, где пройдет региональная встреча IT-специалистов сообщества Инфостарт. Тема мероприятия - управление и технологии автоматизации учета на платформе "1С: Предприятие". Стоимость участия - 5000 рублей. Цена действительна до 26.12.2019.
Что делает "В ИЕРАРХИИ" в запросе? 102
16.07.2019 11291 YPermitin 34
Создание отчетов с помощью СКД - основные понятия и элементы 225
25.06.2019 27748 ids79 17
Новый раздел на Инфостарте - Electronic Software Distribution Промо
Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.
- Низкие цены, без скрытых платежей и наценок
- Оперативная отгрузка
- Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
- Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)
Реализуем Стек, Очередь и Приоритетную очередь в 1С 52
24.06.2019 8820 RonX01 63
Организация хранения промежуточных данных 3
29.05.2019 2492 scientes 1
С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо
Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.
Вычисление 200 тысяч знаков числа pi 74
28.05.2019 4736 Oleg_nsk 96
Регистры накопления. Виртуальные таблицы. Часть №1: Обороты 88
20.05.2019 14496 YPermitin 5
Базовый курс по разработке мобильных 1C-приложений для Android-устройств. Третий поток. Онлайн-интенсив с 11 февраля по 05 марта 2020 г. Промо
Данный онлайн-курс предусматривает изучение базовых принципов создания приложений для операционной системы Android, работающих на мобильной платформе “1С:Предприятие”. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие” при разработке прикладных решений для “обычных” компьютеров, но пока ещё не занимался разработкой 1С-приложений, предназначенных для работы на мобильных устройствах.
7500 рублей
Даем названия переменным: как префиксы экономят наше время 10
06.05.2019 3989 Designer1C 69
Заметки по SQL: Срез последних - аналог запроса 17
15.01.2019 7244 IVC_goal 5
1C:Предприятие для программистов: Запросы и отчеты. Второй поток. Онлайн-интенсив с 17 марта по 16 апреля 2020 г. Промо
Данный онлайн-курс предусматривает углубленное изучение языка запросов и возможностей системы компоновки данных, которые понадобятся при разработке отчетов, работающих на платформе “1С:Предприятие” в рамках различных прикладных решений. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей различных прикладных решений, которые используют в своей работе отчеты разного назначения.
6500 рублей
Разработка и сценарное тестирование с Vanessa-ADD. Концепция, теория и сквозной пример создания сценария 236
09.01.2019 32091 Vladimir Litvinenko 69
Короткое нагрузочное тестирование PostgreSQL простыми запросами 25
1 стартмани
10.12.2018 7801 1 vasilev2015 22
Программы для исполнения 488-ФЗ: Маркировка товаров Промо
1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.
Многопоточное восстановление последовательностей 42
05.12.2018 8348 _ASZ_ 29
Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 132
10.11.2018 25032 ids79 40
Открыто голосование за доклады на INFOSTART MEETUP Krasnodar Промо
Выбирайте и голосуйте за самые интересные доклады, лучшие из них попадут в окончательную программу митапа. Голосование продлится до 30 января 2020 года.
Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C 150
23.08.2018 26163 Rain88 44
Введение в CI для 1С 87
21.11.2017 20372 real_MaxA 22
Перенос документов, остатков и справочников КА 1.1 => КА 2 / УТ 11. Обновлено до КА 2.4.12.х и УТ 11.4.11.х! Промо
Более 130 компаний выполнили переход на КА 2 или УТ 11 с помощью нашей разработки! Позволяет перенести не только остатки и справочники (как типовая обработка), но и документы за нужный период времени. Предоставляем техподдержку, оперативно исправляем замечания, выпускаем обновления при выходе новых релизов программ 1С. Вы можете проверить разработку до покупки: сделаем бесплатный тестовый перенос из вашей базы КА 1.1 и предоставим доступ к базе-результату через веб-клиент!
29700 руб.
Как работает серверный вызов в 1С 463
18.11.2017 46863 pahich 77
#Область ВНЕШНИЕ_ВЫЗОВЫ или MVC в 1С, библиотечность и упрощение интеграции кода 44
12.10.2017 15558 for_sale 58