Небольшая заметка: Несколько товарищей на прошлой неделе задали похожие вопросы по некорректно работающим отборам в отчетах на СКД. Тут одна несложная мысль. Может кому-то ещё пригодиться.
Смоделировал в демке ЕРП упрощенный выдуманный пример с проблемой отбора в отчете на СКД.
Допустим, задача: Собрать по РН Запасы и потребности зарезервированные остатки на одном складе, и показать по тем же позициям свободные остатки на другом складе.
Примечание: В реальности бывают разные примеры:
- Один товарищ недавно спрашивал про отчет по затратам и некорректно работающим в нем отбором по полю Заказ, и - Второй спрашивал про АРМ Закупок и потере сумм при отборе по Назначению.
У вас может быть другой пример, смысл наследуется.
Решение задачи в отчете на СКД:
Подзапрос 1: Берем остатки по РН Запасы и потребности На дату, с отбором по Складу1 и Не пустому Назначению.
Подзапрос 2: Берем остатки по РН Запасы и потребности На дату, с отбором по Складу2 и Пустому Назначению.
Подзапрос 3: Соединяем, и показываем, что на Складе1 зарезервировано, и что из этого на Складе2 свободно.
Первоначальный текст запроса, вроде несложный, ниже:
ВЫБРАТЬ
ЗапасыИПотребностиОстатки.Номенклатура КАК Номенклатура,
ЗапасыИПотребностиОстатки.Назначение КАК Назначение,
СУММА(ЗапасыИПотребностиОстатки.ВНаличииОстаток) КАК ЗанятыйОстаток
ПОМЕСТИТЬ втЗанятыНаСкладе1
ИЗ
РегистрНакопления.ЗапасыИПотребности.Остатки(
&НаДату {(&НаДату)},
Склад = &Склад1
И Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)) КАК ЗапасыИПотребностиОстатки
СГРУППИРОВАТЬ ПО
ЗапасыИПотребностиОстатки.Номенклатура,
ЗапасыИПотребностиОстатки.Назначение
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗапасыИПотребностиОстатки.Номенклатура КАК Номенклатура,
СУММА(ЗапасыИПотребностиОстатки.ВНаличииОстаток) КАК СвободныйОстаток
ПОМЕСТИТЬ втСвободныНаСкладе2
ИЗ
РегистрНакопления.ЗапасыИПотребности.Остатки(
&НаДату {(&НаДату)},
Склад = &Склад2
И Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
И Номенклатура В
(ВЫБРАТЬ
Таб.Номенклатура
ИЗ
втЗанятыНаСкладе1 КАК Таб)) КАК ЗапасыИПотребностиОстатки
СГРУППИРОВАТЬ ПО
ЗапасыИПотребностиОстатки.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втЗанятыНаСкладе1.Номенклатура КАК Номенклатура,
втЗанятыНаСкладе1.Назначение КАК Назначение,
втЗанятыНаСкладе1.ЗанятыйОстаток КАК ЗанятыйОстаток,
ЕСТЬNULL(втСвободныНаСкладе2.СвободныйОстаток, 0) КАК СвободныйОстаток
ИЗ
втЗанятыНаСкладе1 КАК втЗанятыНаСкладе1
ЛЕВОЕ СОЕДИНЕНИЕ втСвободныНаСкладе2 КАК втСвободныНаСкладе2
ПО втЗанятыНаСкладе1.Номенклатура = втСвободныНаСкладе2.Номенклатура
А что тут может быть не так?
А пользователь хочет отобрать по конкретному Назначению, и неожиданно данные теряются...
Рис.1 Тестовый отчет (без отбора по Назначению показывает Свободный остаток)

Рис.2 Тестовый отчет (С отбором по Назначению НЕ показывает Свободный остаток)

Если проверить в Консоли запросов полный запрос из отчета, сделав отбор по полю Назначение в Подзапрос 1 в секции ГДЕ, то Консоль запросов Свободный остаток показывает.
Интересно, как починить или объяснить...
Рис.3 Консоль запросов с отбором по назначению показывает Свободный остаток

Предполагаем, что компоновщик в отчете автоматически цепляет отбор по полю Назначение к Подзапросу 2 (а нам не надо, там по логике задачи с пустым Назначением должен собираться свободный остаток), а отбор надо цеплять только к Подзапрос 1.
Как в итоге наследовать отбор по полю Назначение только на Подзапрос 1 (резерва), а применение его на Подзапрос 2 (свободного остатка) убрать?
Варианта решения и объяснения у меня было два:
- Вар А (топорный): Переименовать поле Назначение в Подзапрос 1 (например в НазначениеПоСклад1) и протащить его по всем запросам до результирующего (см. выше про вопросы товарищей: в случае отчета по затратам и отбору по заказу такой вариант подошёл, там текст запроса был небольшой и отчет только разрабатывался)
Сделать так: [ ЗапасыИПотребностиОстатки.Назначение КАК НазначениеНаСклад1 ]
ВЫБРАТЬ
ЗапасыИПотребностиОстатки.Номенклатура КАК Номенклатура,
ЗапасыИПотребностиОстатки.Назначение КАК НазначениеНаСклад1,
СУММА(ЗапасыИПотребностиОстатки.ВНаличииОстаток) КАК ЗанятыйОстаток
ПОМЕСТИТЬ втЗанятыНаСкладе1
ИЗ
РегистрНакопления.ЗапасыИПотребности.Остатки(
&НаДату {(&НаДату)},
Склад = &Склад1
И Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)) КАК ЗапасыИПотребностиОстатки
СГРУППИРОВАТЬ ПО
ЗапасыИПотребностиОстатки.Номенклатура,
ЗапасыИПотребностиОстатки.Назначение
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗапасыИПотребностиОстатки.Номенклатура КАК Номенклатура,
СУММА(ЗапасыИПотребностиОстатки.ВНаличииОстаток) КАК СвободныйОстаток
ПОМЕСТИТЬ втСвободныНаСкладе2
ИЗ
РегистрНакопления.ЗапасыИПотребности.Остатки(
&НаДату {(&НаДату)},
Склад = &Склад2
И Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
И Номенклатура В
(ВЫБРАТЬ
Таб.Номенклатура
ИЗ
втЗанятыНаСкладе1 КАК Таб)) КАК ЗапасыИПотребностиОстатки
СГРУППИРОВАТЬ ПО
ЗапасыИПотребностиОстатки.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втЗанятыНаСкладе1.Номенклатура КАК Номенклатура,
втЗанятыНаСкладе1.НазначениеНаСклад1 КАК НазначениеНаСклад1,
втЗанятыНаСкладе1.ЗанятыйОстаток КАК ЗанятыйОстаток,
ЕСТЬNULL(втСвободныНаСкладе2.СвободныйОстаток, 0) КАК СвободныйОстаток
ИЗ
втЗанятыНаСкладе1 КАК втЗанятыНаСкладе1
ЛЕВОЕ СОЕДИНЕНИЕ втСвободныНаСкладе2 КАК втСвободныНаСкладе2
ПО втЗанятыНаСкладе1.Номенклатура = втСвободныНаСкладе2.Номенклатура
- Вар Б (рекомендованный): Добавить в текст Подзапрос 1 условие отбора компоновки для поля Назначение с другим именем (а этот вариант был лучше в вопросе по АРМ Закупок и неработающим отбором по Назначению)
Примечание: Этот вариант предпочтительнее, так как реальный текст запроса может быть не такой простой и короткий как в примере, а состоять из множества подзапросов, где протащить новое имя по всему тексту, а затем перевыбирать поле в вариантах настройки СКД - это никому ненужный геморрой.
Сделать так: {ГДЕ ЗапасыИПотребностиОстатки.Назначение.* КАК НазначениеНаСклад1}

ВЫБРАТЬ
ЗапасыИПотребностиОстатки.Номенклатура КАК Номенклатура,
ЗапасыИПотребностиОстатки.Назначение КАК Назначение,
СУММА(ЗапасыИПотребностиОстатки.ВНаличииОстаток) КАК ЗанятыйОстаток
ПОМЕСТИТЬ втЗанятыНаСкладе1
ИЗ
РегистрНакопления.ЗапасыИПотребности.Остатки(
&НаДату {(&НаДату)},
Склад = &Склад1
И Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)) КАК ЗапасыИПотребностиОстатки
{ГДЕ
ЗапасыИПотребностиОстатки.Назначение.* КАК НазначениеНаСклад1}
СГРУППИРОВАТЬ ПО
ЗапасыИПотребностиОстатки.Номенклатура,
ЗапасыИПотребностиОстатки.Назначение
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗапасыИПотребностиОстатки.Номенклатура КАК Номенклатура,
СУММА(ЗапасыИПотребностиОстатки.ВНаличииОстаток) КАК СвободныйОстаток
ПОМЕСТИТЬ втСвободныНаСкладе2
ИЗ
РегистрНакопления.ЗапасыИПотребности.Остатки(
&НаДату {(&НаДату)},
Склад = &Склад2
И Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
И Номенклатура В
(ВЫБРАТЬ
Таб.Номенклатура
ИЗ
втЗанятыНаСкладе1 КАК Таб)) КАК ЗапасыИПотребностиОстатки
СГРУППИРОВАТЬ ПО
ЗапасыИПотребностиОстатки.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втЗанятыНаСкладе1.Номенклатура КАК Номенклатура,
втЗанятыНаСкладе1.Назначение КАК Назначение,
втЗанятыНаСкладе1.ЗанятыйОстаток КАК ЗанятыйОстаток,
ЕСТЬNULL(втСвободныНаСкладе2.СвободныйОстаток, 0) КАК СвободныйОстаток
ИЗ
втЗанятыНаСкладе1 КАК втЗанятыНаСкладе1
ЛЕВОЕ СОЕДИНЕНИЕ втСвободныНаСкладе2 КАК втСвободныНаСкладе2
ПО втЗанятыНаСкладе1.Номенклатура = втСвободныНаСкладе2.Номенклатура
Рис.4 Хотя по факту Вар А и Б сидят на трубе одинаково

Это всё, говорил же - что заметка небольшая =)
| Калькулятор железа для 1C | Два калькулятора расчета железа (процессоры, память, диск) в зависимости от количества пользователей и размера базы для разделенных и совмещенных серверов 1С и СУБД, а также расчета терминального сервера. Описаны формулы расчета и обоснования выбора. |
| Неудачный эксперимент переделки типового Версионирования объектов из XML в JSON | «Ну я хотя бы попытался, черт возьми, хотя бы попробовал» — персонаж Джека Николсона в психушке из фильма «Пролетая над гнездом кукушки» (1975). |
| Ускорение переноса остатков на примере из УПП в ERP | Простые приемы, позволяющие ускорить длительный перенос остатков с устаревших решений 1С на новые, на примере перехода с УПП на ERP, принципы подойдут и для БП/УТ/УПП - ЕРП/КА/УХ и т.д. |
| Проверка зацикливания спецификаций | Обработка проверяет зацикливание спецификаций при производстве изделий в 1C:ERP. Разузловывает по полуфабрикатам и выводит ветки с цикличными позициями. |
| Дополненный выбор в полях и отборах [Уникальный идентификатор, Навигационная ссылка, Объект не найден, Представление документа] | Расширение добавляет возможность в 1С в любых полях и отборах выбирать значения не только Код, Наименование или Номер, но и Уникальный идентификатор, Навигационную ссылку, Объект не найден, Представление документа. |
| Универсальный обмен данными XML 8.2 и 8.3 (дополненный) | Две обработки универсального обмена данными XML для платформ 8.2 и 8.3, поддерживающие стандартные и дополнительные возможности: 1) Сохранение и восстановление настроек дерева правил, отборов и параметров целиком или при обновлении самих правил; 2) Произвольные отборы для выгрузки объектов и отборы, предварительно собранные по Объект не найден, Уникальному идентификатору, Представлению документа, Коду или Наименованию справочника 3) Регистрацию на узлах обмена объектов и выгрузку с узлов с возможностью очистки регистрации; 4) Разные COM компоненты; 5) Тестирование и отладка; 6) Удаление объектов. |
| Универсальный журнал документов в 1С | Внешняя обработка "Универсальный журнал документов" это гибкий инструмент для работы с документами в конфигурациях 1С 1) настройка произвольного состава документов 2) настройка колонок 3) настройка произвольных отборов 4) сохранение и восстановление вариантов настроек 5) групповое проведение, отмена проведения, пометка на удаление 6) просмотр связанных документов. 7) Создание, копирование документов |
| Инвентаризация ТМЦ (расширение) | Инвентаризация ТМЦ проводится в организации для определения количества, стоимости и состояния материальных ценностей и позволяет выявить излишки или недостачи имущества. Расширение добавляет в базу новый документ, который заполняется по данным бухгалтерского учета по любым счетам (с субконто Номенклатура, Физические лица, например: МЦ.02, МЦ.03.МЦ.04, 10.11 или др.). Документ содержит отборы, настройку подписантов, печатную форму ИНВ-3 и ведомость. |
| Расширение: Контроль заполнения субконто | Расширение, позволяет настраивать контроль заполненности Субконто и Подразделений при формировании проводок бух. учета в разрезе Организаций и Счетов. |
| Расширение: Блокировка элементов справочников от изменений | Отметка проверки (блокировки) к любому виду справочника (Флаг, Ответственный и Время) и запрет редактирования проверенного элемента. |
| Расширение: Проверка документов | Отметка проверки к любому виду документа (Флаг, Ответственный и Время) и запрет редактирования проверенного документа. |
| Расширение: Оригиналы документов | Отметка к любому виду документа, о том что получен его оригинал (Флаг, Ответственный и Время) |
| Копирование прав между пользователями | Обработка по копированию прав пользователя на список других пользователей |
| Расширение: Быстрые отборы через буфер [Alt+C] Копировать, [Alt+V] Вставить | Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации клавиш [Alt+C] Копировать, [Alt+V] Вставить. |
| Резервное копирование и восстановление 1С баз на PostgreSQL в Windows с помощью pgAdmin, bat-файлов и планировщика | В данной инструкции будет описано, как с помощью pgAdmin, bat-файлов и планировщика заданий Windows организовать резервное копирование, восстановление и хранение копий баз данных. |
| Гарантированное проведение документов (подключаемое расширение) | Гарантированное проведение указанного в регистре сведений списка документов. Регистрируем документы к проведению с помощью произвольных отборов СКД в регистре сведений, далее запускаем фоновое проведение в нескольких потоках. Проведенные документы удаляются из регистра, по непроведенным регистрируются ошибки. |
| Ускорим проведение в 1С:Управление холдингом | В 1С:Управление холдингом есть "нехороший" запрос, который съедает значительную часть времени проведения документов. Если его подправить, то проведение заметно ускорится. |
| Динамическая кнопка VS Комбинация клавиш | Часто требуется ко всем формам или к списку форм привязать новые действия. Но как это сделать не меняя каждую форму и в идеале не меняя конфигурацию? Ниже будет описано, как запрограммировать новые действия через расширение (т.е. не меняя конфигурации) и сделать это универсально (не меняя каждую форму). |
| Параметризация печатных форм под контрагентов (подключаемое расширение) | Расширение добавляет возможности параметризации печати для контрагентов. Подробнее описано здесь //infostart.ru/1c/articles/1510459/ |
| Просмотр объектов очереди сообщений в 1С:Документооборот | В базах с бесшовной интеграцией с 1С:Документооборот есть Регистр сведений "Очередь сообщений в 1С:Документооборот". Для пользователя он мало информативен. Расширение позволяет просматривать сообщение в человеческом виде. И понимать проблему до объекта. |
| Поддержка пользователей [Alt+S] (подключаемое расширение) | Расширение, подключаемое к базе 1С для решения задач поддержки пользователей. Позволяет быстро (по кнопке или комбинации клавиш Alt+S), не выходя из программы 1С из любой формы, создать обращение к консультантам и программистам со скринами, файлами, в привязке к проблемному объекту (документу, справочнику, отчету, обработке и т.п.). Вести переписку по обращениям, отслеживать их выполнение с трудозатратами и уведомлять участников через механизмы: Telegram, Обсуждения 1С и Электронную почту. Код открыт и расширение может развиваться и быть доработано под индивидуальные потребности. |
| Интерактивная справка [Alt+I] (подключаемое расширение) | Дополнительная справка, подключаемая к базе 1С. Содержит дерево разделов и статьи. Позволяет создавать статьи с картинками, прикреплять к ним файлы и видео, а также связывать статьи с объектами 1С (документам, справочникам, отчетам). Вызывается на динамически создаваемую кнопку панели либо быстрой комбинацией клавиш Alt+I. |
| Защита объектов от изменения обменом | Расширение позволяет пользователю заблокировать объект 1С (документ, справочник) от изменения последующими загрузками данных или обменами. |
| Доп. панель Alt+Z | Панель, вызываемая для объекта комбинацией клавиш Alt+Z (для документа, справочника, плана вида характеристик, плана счетов и т.д.). Возможности: Редактор всех реквизитов, таблиц и движений, Анализ прав к объекту, Поиск ссылок на объект с фильтрами, Сторно движений документа, Выгрузка/загрузка текущего объекта между базами. Подключается как Расширение. |
| Создание стартовой базы | Часто требуется создать «Новую базу» почти пустую, но совпадающую с «Исходной базой» по необходимым обязательным настройкам: константам, регистрам сведений, справочникам, видам субконто и планами счетов и т.п., при этом уникальные идентификаторы объектов должны совпадать. |
| Групповое добавление и удаление ролей из списка профилей | Подключаемая обработка. Помогает при конструировании профилей доступа пользователей (настройке прав пользователей), экономит время на добавлении/удалении одной и той же роли сразу в нескольких профилях. |
| Интерактивная справка по объектам 1С (автономное расширение) | База знаний, подключаемая к объектам основной базы. Ведётся интерактивно, формируется в виде статей прямо в 1С (текст, картинки, таблицы, ссылки). Есть возможность прикрепления файлов, привязки к объектам 1С, возможности рейтинга и комментирования пользователями. |
| Значения по умолчанию для пользователей (Расширение) | При заполнении документов и справочников пользователи часто сталкиваются с необходимостью ввода одних и тех же реквизитов. Заполнение в документах некоторых из них, таких как: Организация, Склад и т.п. - выполняется реализованным в 1С механизмом подстановки значения из последних 3-5 введенных документов. Если же вы хотите заполнять все реквизиты шапки (и даты, и флажки, и другие поля, включая дополнительные реквизиты), то вам поможет данный механизм. |
| Контекст любого объекта конструкцией #Если Фамилия Тогда | Делаем инициализацию переменной в "своей" инструкции препроцессора, для получения контекстной подсказки объекта через точку. В дальнейшем в компилированном коде сама инициализация игнорируется, т.к. "своя" инструкция препроцессора НИКОГДА не выполняется. |
| Отключение Монитора ИТС и Проверки наличия обновления (расширение) | Некоторые интернет-сервисы базы 1С у пользователей вызывают замедления работы и клиенту не нужны. Их можно отключить через расширения. |
| Памятка работ по проекту 1С | Схема работ по проекту внедрения 1С освежает в голове и визуализирует общую картину мероприятий. Будет полезно как для Заказчика так и для Исполнителя при подготовке проекта и проведении совещаний по ходу проекта. |
| Использование Стека вызовов в качестве условия оператора Если [...] Тогда | Делюсь интересным приёмом, позволяющим использовать данные стека исполнения кода 1С в качестве условия, накладываемого на выполнение кода. |
| Уведомление пользователей об изменениях в объектах (расширение) | Позволяет без доработок настроить уведомления пользователям об изменениях объектов и их реквизитов. Уведомления отправляются в виде задач по проверке объектов с ссылками на объекты. |
| Права доступа к объектам с гибкими отборами (расширение) | Возможность без доработок конкретизировать пользователям права Просмотра и Изменения объектов базы 1С, установив ограничения с помощью отборов системы компоновки данных. |
| Памятка работ по задаче 1С | Памятка выполняемых работ по решению длительных задач по 1С |
| Применение программистом таблицы рисков для оценки технического задания | Я как программист часто получаю технические задания, по которым от меня хотят услышать оценку. Привожу описание метода оценки задания, заимствованный из проектной технологии, по которому я оцениваю тех. задания |
| Добрый великан | Руководители проектов определяют наше настоящее, каким оно будет?! Ответ прост - таким, каким и сам РП. |
| Настройка ограничений входа пользователей в базу (расширение) | Настраиваем для пользователей 1С разрешенное количество открытых сеансов к текущей базе данных 1С в привязке к компьютерам. (У пользователя не будет возможности превысить допустимое количество сеансов или зайти с чужого компьютера). |
| Переход с партий и производства версии 2.1 на режимы 2.2 в 1С:ERP в середине года | В данной статье рассказано о практическом опыте ВЦ «Раздолье» в переводе работы клиентов в «1С:ERP Управление предприятием» на новые режимы: использование производства 2.2 и партионный учет версии 2.2 (далее режимы 2.2) после начала года, доработки изменения. |
| БП 3.0, Закрытие месяца, Отключение проверок операций прошлых периодов | Расширение конфигурации, отключающее ошибки прошлых периодов, которые блокируют закрытие текущего месяца. Например, "Нарушена последовательность регламентных операций" и т.д. |
| Проводим по БУ "на лету" | В базе ERP и КА есть форма тестировщика, которая автоматически получает из конфигурации полные тексты запросов формирования бухгалтерских проводок выбранного документа, даёт возможность модифицировать запрос и сразу проверить результат. |
| Административная панель #расширение объекта | Панель команд текущего объекта (документа, справочника и т.д.) со следующим возможностями: Редактор реквизитов, таблиц и движений текущего объекта, Анализ прав доступа к текущему объекту, Поиск ссылок на объект с отборами, Сторно движений документа, Выгрузка/загрузка текущего объекта между базами. Реализована всплывающей панелью в форме объекта. Подключается как расширение конфигурации (*.cfe) либо отдельными обработками. |