Недопустимое поле для группировки

Недопустимое поле для группировки. Поиск альтернатив

«ВЫБРАТЬ | МИНИМУМ(ВложенныйЗапрос.Поле1) КАК Дни, | ВложенныйЗапрос.Регистратор.Контрагент КАК Покупатель, | КонтактнаяИнформация.Вид |ИЗ | (ВЫБРАТЬ | ВзаиморасчетыСКонтрагентами.Регистратор КАК Регистратор, | РАЗНОСТЬДАТ(ВзаиморасчетыСКонтрагентами.Период, &РабДата, ДЕНЬ) КАК Поле1 | ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами | ГДЕ | ВзаиморасчетыСКонтрагентами.Регистратор = ВзаиморасчетыСКонтрагентами.Регистратор) КАК ВложенныйЗапрос | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ТочкиИТПредставителиСрезПоследних.ТочкаТорговая КАК ТочкаТорговая, | ПРЕДСТАВЛЕНИЕ(ТочкиИТПредставителиСрезПоследних.ТочкаТорговая) КАК ТочкаТорговаяПредставление | ИЗ | РегистрСведений.ТочкиИТПредставители.СрезПоследних КАК ТочкиИТПредставителиСрезПоследних | ГДЕ | ТочкиИТПредставителиСрезПоследних.Предстаитель = &Предстаитель) КАК ВложенныйЗапрос1 | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация | ПО КонтактнаяИнформация.Объект = ВложенныйЗапрос1.ТочкаТорговая | ПО ВложенныйЗапрос.Регистратор.Контрагент = ВложенныйЗапрос1.ТочкаТорговая |ГДЕ | (НЕ ВложенныйЗапрос.Регистратор.Контрагент В | (ВЫБРАТЬ | ВложенныйЗапрос.ДоговорКонтрагентаВладелец | ИЗ | (ВЫБРАТЬ | РАЗНОСТЬДАТ(ЗаказыПокупателей.Период, &РабДата, ДЕНЬ) КАК Поле1, | ЗаказыПокупателей.ДоговорКонтрагента.Владелец КАК ДоговорКонтрагентаВладелец | ИЗ | РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей | ГДЕ | ЗаказыПокупателей.Регистратор = ЗаказыПокупателей.Регистратор | ) КАК ВложенныйЗапрос | СГРУППИРОВАТЬ ПО | ВложенныйЗапрос.ДоговорКонтрагентаВладелец | ИМЕЮЩИЕ | МИНИМУМ(ВложенныйЗапрос.Поле1) < 7)) | И КонтактнаяИнформация.Тип = &Тип | |СГРУППИРОВАТЬ ПО | ВложенныйЗапрос.Регистратор.Контрагент, | КонтактнаяИнформация.Вид | |ИМЕЮЩИЕ | МИНИМУМ(ВложенныйЗапрос.Поле1) > 7»; Это запрос, который получает нужную выборку. Мне нужно добавить еще одно поле, где отражается адрес контрагента (все адреса!!!!). Для практики сделала мелкий запрос, где адреса получила при помощи поля КонтактнаяИнформация.Представление. Добавляю его здесь, но конструктор автоматом едо добавляет в группировку и начинает ругатся!

1С (Код)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ТоварыНаСкладах Приход Движения.ТоварыНаСкладах.Записывать = Истина; Движения.ТоварыНаСкладах.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ТоварыНаСкладах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.Количество = ТекСтрокаТовары.Количество; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры

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

Чтобы посмотреть какие же товары есть у нас на складе мы сделаем отчет, который будет показывать остатки по регистру «ТоварыНаСкладах”.
Переходим в режим Конфигуратор и создаем отчет. Название устанавливаем «ОстаткиТоваров”. На закладе формы создаем новую форму отчета, и назначаем ее основной. Добавляем на форму ПолеТабличногоДокумента, это можно через меню «Форма-Вставить элемент управления” и выбрать вид элемента — поле табличного документа, назначить ему имя ТабДок и расположить на всю форму.

Затем переходим в обработчик кнопки «Сформировать”, удаляем находящийся там комментарий, устанавливаем курсор в тексте процедуры обработчика события, щелкаем правой кнопкой мыши и выбираем «Конструктор запроса с обработкой результата”. Это позволит нам создать запрос и сразу вывести его результат в отчет.
На закладке Обработка результата выбираем «Вывод в табличный документ”, переходим на закладку «Таблицы и поля”. Видим, что таблица ТоварыНаСкладах представление в виде четырех таблиц.

Первая таблица — это список записей, которые мы формировали в обработке проведения документов, остальные это виртуальные таблицы, которые платформа создает сама. Эти таблицы позволяют нам получить обработанные данные по регистру — обороты за период, остатки на дату, или остатки и обороты в одной таблице. Мы хотим вывести остатки, поэтому выбираем таблицу Остатки. Из этой таблицы выбираем все поля Номенклатура и КоличествоОстаток. Нажимаем кнопку ОК.
Конструктор сформировал алгоритм, который выведет нам отчет по остаткам, нам лишь нужно указать куда вывести отчет.
Добавим строку:
«ТабДок = ЭлементыФормы.ТабДок;” перед текстом, сформированным конструктором.

1С (Код)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ТабДок = ЭлементыФормы.ТабДок; //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Макет = Отчеты.ОстаткиТоваров.ПолучитьМакет(«Макет»); Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура, | ПРЕДСТАВЛЕНИЕ(ТоварыНаСкладахОстатки.Номенклатура), | ТоварыНаСкладахОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки»; Результат = Запрос.Выполнить(); ОбластьЗаголовок = Макет.ПолучитьОбласть(«Заголовок»); ОбластьПодвал = Макет.ПолучитьОбласть(«Подвал»); ОбластьШапкаТаблицы = Макет.ПолучитьОбласть(«ШапкаТаблицы»); ОбластьПодвалТаблицы = Макет.ПолучитьОбласть(«ПодвалТаблицы»); ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть(«Детали»); ТабДок.Очистить(); ТабДок.Вывести(ОбластьЗаголовок); ТабДок.Вывести(ОбластьШапкаТаблицы); ТабДок.НачатьАвтогруппировкуСтрок(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи); ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень()); КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСтрок(); ТабДок.Вывести(ОбластьПодвалТаблицы); ТабДок.Вывести(ОбластьПодвал); //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

Запустим режим 1С:Предприятие и посмотрим работу отчета.

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

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

Вернемся к документу «РеализацияТоваров”, на закладе движения установим «галочку” напротив регистра «Продажи”, и нажмем кнопку «Конструктор движений”. Нажмем кнопку (+) (добавить) и выберем регистр «Продажи”, дальше как обычно выбираем табличную часть и нажимаем «Заполнить выражения”. «ОК”.

1С (Код)

1 2 3 4 5 6 7 8 9 10 11 // регистр Продажи Движения.Продажи.Записывать = Истина; Движения.Продажи.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Клиент = Клиент; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.Количество = ТекСтрокаТовары.Количество; Движение.Сумма = ТекСтрокаТовары.Сумма; КонецЦикла;

Запускаем 1С в режим Предприятие, перепроводим документы «РеализацияТоваров”, проверяем сформированы ли движения. Отчет вы можете сформировать сами, делается это все по такому же принципу как и прошлый отчет, таблицу нужно выбирать «Продажи.Обороты”.А теперь давайте в нашу конфигурацию добавим интерфейс, чтобы не приходлось документы открывать через меню «Операции”. Открываем в конфигураторе ветку «Общие”, ищем в ней Интерфейсы и добавляем новый. Откроется конструктор интерфейсов, в нем нажимаем кнопку «Построить”. Все. Упрощенный интерфейс готов. Чтобы он открывался по умолчанию нужно в свойствах конфигурации (правой кнопкой по самому верхнему элементу дерева конфигурации — Свойства) установить в качестве основного интерфейса, созданный нами интерфейс.
Получиться такой вид:

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

>Заметки из Зазеркалья

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

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

Реализовано в версии 8.3.14.1565.

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

Динамическое считывание данных становится возможным благодаря тому, что списку указывается основная таблица. Ключевые поля этой таблицы используются платформой для однозначной идентификации строк списка. Например, если список отображает данные справочника или документа, то в качестве ключевого поля используется поле Ссылка. Если список отображает записи какого-нибудь регистра, то для идентификации отдельных строк платформа использует объекты, содержащие значения нескольких ключевых полей. Эти объекты имеют разные названия для разных таблиц, но у них есть общая часть – «КлючЗаписи». Например, РегистрСведенийКлючЗаписи.<имя регистра>, РегистрРасчетаКлючЗаписи.<имя регистра> и т.д.

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

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

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

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

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

Вид ключа может быть указан следующим образом:

  • ЗначениеПоля – для такого ключа вам нужно выбрать одно единственное ключевое поле, и поведение списка в этом случае будет таким же, как у списка, содержащего ссылочные объекты (список справочника, список документа и т.д.);
  • КлючСтроки – для такого ключа вам нужно выбрать одно или несколько ключевых полей, и поведение списка в этом случае будет таким же, как у списка, содержащего записи (список регистра накопления, список регистра сведений и т.д.);
  • НомерСтроки – это имитация того поведения, которое существовало раньше; в качестве ключа будет использоваться номер строки в выборке со всеми вытекающими из этого недостатками;
  • Авто – в этом случае платформа сама автоматически определит вид ключа как один из трех перечисленных выше: если ключевые поля не заданы, то будет НомерСтроки, если задано одно ключевое поле, то ЗначениеПоля, если более одного ключевого поля, то КлючСтроки.

Таким образом, теперь, если вы выбираете для своего произвольного запроса вид ключа ЗначениеПоля или КлючСтроки, вам становятся доступны:

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

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

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

Рассказать друзьям: