Объединить таблицы 1С

17 правил для составления оптимального ЗАПРОСа к данным базы 1С  37
  Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps  19
 была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1C медленно работает по сети с базой на SQL Server  17
 Данное обстоятельство может быть обусловлено многими причинами. Одна из них — неоптимальная настройка MS SQL . Перечислим неоптимальности в настройке: 1) Неправильно указанный сетевой протокол, используемый для взаимодействия 1С с SQL Server. П 1Cv8.1CD — Файл данных достиг максимального размера!  7
 1С выдает предупреждение » Файл данных достиг максимального размера» . Подскажите из — за чего это и как можно решить ? Превышен размер файла, обычно это сообщение возникает, когда размер файла 1Cv8.1CD приближается к 10 гигабайтам или размер ка 1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ?  5
  Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 — получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче Посмотреть все результаты поиска похожих

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

  • левое;
  • правое,
  • внутреннее;
  • полное.

Каждый тип мы рассмотрим на абстрактном примере. Имеется 2 таблицы, в первой храним описательную информацию о номенклатуре, во второй о ее остатках:


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

Левое соединение

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

Запрос.Текст =
«ВЫБРАТЬ
| Номенклатура.Товар,
| Номенклатура.Цвет КАК ЦветНоменклатура,
| Остатки.Цвет КАК ЦветОстатки,
| Остатки.Количество
|ИЗ
| Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
| ПО Номенклатура.Товар = Остатки.Товар»;
Для стула не нашлось сопоставлений из таблицы остатков, поэтому поля заполнились значениями NULL, которые обязательно нужно обработать функцией ЕСТЬNULL, см. Функции языка запросов 1С 8.
Левое соединение работает примерно как цикл в цикле — берется первая запись из левой таблицы и пробегаются все записи из правой на предмет удовлетворения условию связи. Затем берется вторая запись из левой таблицы и т.д. Если вдруг условию связи удовлетворяют несколько записей из правой таблицы, то в результирующую таблицу будет добавлено несколько строк (по количеству удачных связей).Как видим, полученная таблица не информативна, данные не отражают реальную суть, поэтому лучше связать эти таблицы по двум полям: Товар и Цвет, только на этот раз обработаем NULLы:
Запрос.Текст =
«ВЫБРАТЬ
| Номенклатура.Товар,
| Номенклатура.Цвет,
| ЕСТЬNULL(Остатки.Количество, 0) КАК Количество
|ИЗ
| Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
| ПО Номенклатура.Товар = Остатки.Товар
| И Номенклатура.Цвет = Остатки.Цвет»;

Правое соединение

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

Внутреннее соединение

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

Запрос.Текст =
«ВЫБРАТЬ
| Номенклатура.Товар,
| Номенклатура.Цвет,
| Остатки.Количество КАК Количество
|ИЗ
| Номенклатура КАК Номенклатура
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Остатки КАК Остатки
| ПО Номенклатура.Товар = Остатки.Товар
| И Номенклатура.Цвет = Остатки.Цвет»;

Полное соединение

Полное соединение передаст в результат все записи из обоих таблиц, те записи, которые удовлетворяет условию связи — будут связаны, те записи, которые не удовлетворяют условию связи все равно окажутся в результате запроса, но с частью NULLовых полей. Полное это как бы левое и правое соединения в одном.
Задач на эту тему может быть много, давайте попробуем решить одну из них. Наша организация является дилером 2 мебельных фабрик: «Заря» и «Рассвет». Ассортимент со стоимостью каждой из фабрик хранится в разных таблицах. Необходимо составить единый прайс лист, причем брать в него продукцию по минимальной цене:

Применим полное соединение с выборкой всех полей, связывать будем по товару:
Запрос.Текст =
«ВЫБРАТЬ
| НоменклатураЗаря.Товар КАК ТоварЗаря,
| НоменклатураЗаря.Цена КАК ЦенаЗаря,
| НоменклатураРассвет.Товар КАК ТоварРассвет,
| НоменклатураРассвет.Цена КАК ЦенаРассвет
|ИЗ
| НоменклатураЗаря КАК НоменклатураЗаря
| ПОЛНОЕ СОЕДИНЕНИЕ НоменклатураРассвет КАК НоменклатураРассвет
| ПО НоменклатураЗаря.Товар = НоменклатураРассвет.Товар»;

Это не совсем то, что нам нужно, давайте соединим поле товар в одно и обработаем NULLы:
Запрос.Текст =
«ВЫБРАТЬ
//конструкция ЕСТЬNULL рассматривалась в разделе функции языка запросов
| ЕСТЬNULL(НоменклатураЗаря.Товар, НоменклатураРассвет.Товар) КАК Товар,
//если цена не определена, то инициализируем ее
//почему 1000000 см. пояснения ниже
| ЕСТЬNULL(НоменклатураЗаря.Цена, 1000000) КАК ЦенаЗаря,
| ЕСТЬNULL(НоменклатураРассвет.Цена, 1000000) КАК ЦенаРассвет
|ИЗ
| НоменклатураЗаря КАК НоменклатураЗаря
| ПОЛНОЕ СОЕДИНЕНИЕ НоменклатураРассвет КАК НоменклатураРассвет
| ПО НоменклатураЗаря.Товар = НоменклатураРассвет.Товар»;
Осталось только выбрать минимальную цену. Итоговый тект запроса будет выглядеть следующим образом:
Запрос.Текст =
«ВЫБРАТЬ
| ЕСТЬNULL(НоменклатураЗаря.Товар, НоменклатураРассвет.Товар) КАК Товар,
| ВЫБОР
| КОГДА ЕСТЬNULL(НоменклатураЗаря.Цена, 1000000) > ЕСТЬNULL(НоменклатураРассвет.Цена, 1000000)
| ТОГДА ЕСТЬNULL(НоменклатураРассвет.Цена, 1000000)
| ИНАЧЕ ЕСТЬNULL(НоменклатураЗаря.Цена, 1000000)
| КОНЕЦ КАК Цена
|ИЗ
| НоменклатураЗаря КАК НоменклатураЗаря
| ПОЛНОЕ СОЕДИНЕНИЕ НоменклатураРассвет КАК НоменклатураРассвет
| ПО НоменклатураЗаря.Товар = НоменклатураРассвет.Товар»;

Если цена не определена (NULL), то ее необходимо инициализировать каким либо значением, иначе операция сравнения на больше/меньше вывалится с ошибкой. инициализируем цену нереально большой суммой, чтобы она «проиграла» в операции сравнения, ведь по условию задачи мы подбираем наименьшую цену.

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

Автоподсчёт итогов по колонке в табличной части 1С

И так преступим, запускаем 1С в режиме конфигуратора. Далее переходим в созданный ранее документ. Открываем его и переходим на вкладку формы и открываем её.

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

После чего на форме в табличной части снизу должен появиться подвал.

Теперь на нужно чтобы в колонке Сумма подсчитывался итого. Для этого на вкладке Элементы ищем пункт с Название МатериалыСумма и кликаем на нем два раза. Справа появиться свойства поля в них ищем пункт
ТекстПодвала и вписываем Итого. А в пункте ПутьКДаннымПОдвала кликаем на три точечки.

В открывшемся окне нужно выбрать ИтогоСумма.

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

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

Задание 4. Добавление сервисных функций в документы

1. Вычисление итоговых сумм в документах

Часто бывает удобно видеть в форме документа, имеющего табличную части, итоги по каким-либо колонкам. Как правило, итоги вычисляют для суммовых показателей документа (например, «Сумма», «Сумма НДС» и т.п.). Простейшим способом вычислить итог по колонке документа и отобразить его в форме документа является добавление в форму документа «Подвала» (см. пп. 1.1 – 1.4). Настроим вычисление суммы для документа «Оказание услуг».

1.1 Открыть форму документа «Оказание услуг». Вызвать свойства табличного поля «Услуги». В группе свойств «Характеристики» включить флажок «Подвал». В табличном поле появится нижняя, серая строка («подвал»).

1.2 Щелчком по заголовку колонки «Услуга» открыть окно свойств этой колонки. В группе свойств «Основные» в поле «Текст подвала» написать текст «Итого:».

1.3 Щелчком по заголовку колонки «Сумма» открыть окно свойств этой колонки. В группе свойств «Характеристики» включить флажок «ОтображатьИтогиВПодвале», а в поле «ГоризонтальноеПоложениеВПодвале» выбрать вариант «Прижать вправо» (т.к. по стандартам числовые значения должны выравниваться по правому краю).

1.4 Проверить вычисление итога в режиме «1С:Предприятие».

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

1.5 Создать новый реквизит документа «Оказание услуг» (до этого данный документ не имел реквизитов , он имел только реквизиты табличной части ).

1.6 В окне свойств реквизита задать имя «СуммаИтого» и синоним «Сумма (итого)».

1.7 Установить для реквизита такие же тип данных и размерность, как и для реквизита «Сумма» табличной части «Услуги» (Число, длина: 15, точность: 2).

1.8 Открыть модуль объекта (закладка «Прочее», кнопка «Модуль объекта») и написать в нем текст процедуры:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

СуммаИтого = Услуги.Итог(«Сумма»);

КонецПроцедуры

(Приведенный текст можно разместить ниже или выше уже имеющейся в модуле процедуры «ОбработкаПроведения».)

Благодаря наличию этой процедуры, перед записью документа (например, нажатием на кнопку «Записать» или «ОК») в реквизит «СуммаИтого» будет помещен итог по реквизиту «Сумма» табличной части «Услуги». Этот реквизит будет автоматически размещен в форме списка данного документа, а также может быть добавлен в качестве графы в журнал документов, содержащий этот документ (см. ниже).

1.9 Проверить наличие колонки с итоговой суммой в форме списка документа «Оказание услуг» в режиме «1С:Предприятие». (Для того, чтобы в колонке отобразилась сумма по уже введенным документам, эти документы необходимо открыть и перезаписать).

1.10 Аналогичным образом организовать вычисление итоговых сумм в документах «Поступление материалов» и «Передача материалов в производство».

2. Создание печатных форм документов

Одной из функций объекта конфигурации «Документ» в системе «1С:Предприятие» является формирование печатной формы первичного документа. Наиболее простой способ организовать формирование и вывод печатной формы документа – воспользоваться «Конструктором печати». Создадим печатную форму для документа «Оказание услуг».

2.1 В окне свойств документа «Оказание услуг» переключиться на закладку «Макеты». Нажать на кнопку «Конструкторы»; в появившемся меню выбрать пункт «Конструктор печати».

2.2 В окне конструктора на первой странице выбрать размещение процедуры печати в форме документа – переставить переключатель («в модуле / в модуле формы») в положение «в модуле формы». Имя процедуры оставить по умолчанию – «Печать». Нажать кнопку «Далее».

2.3 На странице выбора реквизитов «шапки» выбрать реквизиты «Номер» и «Дата» (двойным щелчком). Нажать «Далее».

2.4 На странице выбора реквизитов «табличной части» выбрать оба реквизита «Услуга» и «Сумма». Нажать «Далее».

2.5 На странице выбора реквизитов «подвала» («нижней» части печатной формы документа) выбрать реквизит «СуммаИтого». Нажать «Далее».

2.6 На последней странице конструктора указать вызов процедуры при помощи новой кнопки «Печать» и установить вариант показа таблицы «Только просмотр». Нажать кнопку «ОК».

Однажды, меня, программера, попросили подменить оператора и забить несколько приходных накладных. Набирая документы, я обратил внимание, что у меня очень много времени уходило на выверку накладной и поиск ошибок в заполнении сумм и количеств. Если же все суммы сходились с первого раза, то вспоминался анекдот про двойную ошибку при составлении баланса . Большинство накладных поступает в форме Торг-12, где на каждой странице есть промежуточные итоги по количествам и суммам. Почему бы не использовать это?

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

Шаг 1: Подключить внешнюю обработку заполнения табличных частей.

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

Шаг 2: Инициализировать обработку.

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

Шаг 3: Настроить колонки.

Расчет итогов производится по колонкам, в которых хранятся числовые данные. Для того, чтобы установить или убрать вывод итога по колонке необходимо нажать кнопку «Настройка колонок» и в открывшемся окне отметить колонки, по которым рассчитывать итоги. Автоматически устанавливается вывод итогов в колонках, наименование которых содержит слова «Сумма» или «Количество».

Шаг 4: Вывести итоги.

Теперь осталось активизировать строку, после которой Вы хотите видеть итоги, и нажать кнопку «Показать промежуточные итоги» (Ctrl + Пробел) или «Показать нарастающие итоги» (Ctrl + Alt + Пробел). В случае показа нарастающих итогов будут рассчитаны и показаны итоги от первой строки до текущей включительно. В случае показа промежуточных итогов производится подсчет результатов от предыдущей строки с промежуточными итогами или от начала, если это первая строка промежуточных итогов.

Бонус.

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

Результат.

После того, как Вы нашли ошибку в количествах или суммах, вернитесь в форму документа и поправьте там данные. А содержимое табличного поля в обработке обновится автоматически!

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

Благодарности.

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

Если хотите иметь данный функционал непосредственно в форме (например, в форме документа «Поступление товаров и услуг») — !