Опубликовано ср, 18/04/2012 — 00:07 пользователем guru
1. Создаём Критерий отбора.
2. Выбираем тип данных, по которому будет производиться отбор в списке документов.
3. Выбираем справочники и документы, в которых будет применяться отбор.
4. Создаём новую форму списка копированием.
5. Добавляем реквизит формы с типом данных как и в критерии отбора.
6. Добавляем на форму поле ввода. (Данные – реквизит формы, созданный в п.5. Выбор групп и элементов – Элементы.)
7. Создаём обработчик события ПриИзменении.
//Отбор по номенклатуре
Процедура НоменклатураПриИзменении(Элемент)
Если ЗначениеЗаполнено(Номенклатура) Тогда
Отбор.ОтборПоНоменклатуре.Установить(Номенклатура);
Иначе
Отбор.ОтборПоНоменклатуре.Использование = Ложь;
КонецЕсли;
КонецПроцедуры
8. Устанавливаем созданную форму в качестве основной формы списка.
© При копировании материалов сайта ссылка на оригинал обязательна.
На днях получил задание реализовать поиск документа по контрагенту, указанному в нем. Все было бы элементарно просто, но структура документа была не совсем обычна. Документ регистрирует продажу долга контрагентов сторонней организации, при этом одним документом может продаваться сразу несколько долгов. Поэтому в документе есть табличная часть, состоящая из двух колонок: Контрагент и СуммаДолга.
Список документов представлен управляемой формой и динамическим списком на ней. И конечно стандартный инструмент Настройка списка дает возможность проводить отбор только по реквизитам документа, но не по реквизитам табличной части.
Рассмотрим причину возникновения этой проблемы. Дело в том, что формирование динамического списка происходит на основе запроса. Этот запрос может быть сформирован как вручную, так и автоматически, если мы указываем Основную таблицу динамического списка. Когда мы создаем форму списка по умолчанию применяется второй способ — автоматическое формирование запроса. При этом в выбираемые поля запроса попадают все реквизиты документа и табличные части. И именно по этим полям потом можно делать отбор. Но табличные части попадают в поле запроса целиком, поэтому сделать отбор по конкретному реквизиту табличной части невозможно.
Решением проблемы может быть изменение стандартного автоматически формируемого запроса. Для этого нужно выполнить следующие действия:
- В свойствах реквизита Список на управляемой форме установим флаг Произвольного запроса и перейдем в Настройку списка. Для наглядности для появившегося запроса можно открыть конструктор запросов.
- В конструкторе запросов необходимо убрать из полей выборки все табличне части. Вместо этого добавим табличную часть, по реквизиту которой необходимо делать отбор, в источники запроса (таблицы).
- Далее левым соединением соединяем табличные части с самим документом.
- И делаем группировку по всем полям (хотя можно и использовать ВЫБРАТЬ РАЗЛИЧНЫЕ).
- На вкладке Компановка данных — Таблицы снимаем флаг Обязательно для табличной части. Это нужно для того, чтобы соединение выполнялось не всегда, а только если используется отбор. Таким образом экономятся ресурсы и ускоряется работа конфигурации.
На вкладке Компановка данных — Условия создаем необходимые условия отбора по необходимым реквизитам табличной части.
- Сохраняем запрос и переходим на вкладку Настройка. Там можно сразу добавить необходимые условия отбора, чтобы пользователям самим не приходилось каждый раз выбирать поля. Не забудьте снять флаги с полей отбора, иначе при открытии формы списка условие отбора будет сразу применено.
|
|||
bplmeddy
19.07.16 — 13:41 |
Добрый день. |
||
Горогуля
1 — 19.07.16 — 13:42 |
ссылка в списке |
||
bplmeddy
2 — 19.07.16 — 13:44 |
(1) Не очень Вас понял. Если можно — поподробней обьясните пожалуйста. |
||
PR
3 — 19.07.16 — 13:45 |
Вообще-то из коробки уже работает, че вы там городите? |
||
Горогуля
4 — 19.07.16 — 13:45 |
наклади фильтр по ссылке. чтоб она была в заранее подготовленном списке |
||
bplmeddy
5 — 19.07.16 — 13:47 |
(4) Воистину,всё гениальное — просто. Идея насколько простая, настолько и хороша. Спасибо огромное, буду пробовать. |
||
hhhh
6 — 19.07.16 — 13:48 |
критерии отбора покурите |
||
PR
7 — 19.07.16 — 13:49 |
(0) УФ? |
||
bplmeddy
8 — 19.07.16 — 13:50 |
(7) Нет. |
||
bplmeddy
9 — 19.07.16 — 13:53 |
(4) (5) Хотя есть и трудность. Если таких документов 10-15, а вывести надо все? Фильтр то работает по принципу Равно/Неравно, а ссылки уникальны. Вот и загвоздка. |
||
Горогуля
10 — 19.07.16 — 13:54 |
ссылка в списке. в списке ссылка. списке ссылка в. в ссылка списке |
||
hhhh
11 — 19.07.16 — 13:56 |
(9) тогда критерии отбора покурите |
||
bplmeddy
12 — 19.07.16 — 13:56 |
(10) Прошу простить мою «глупость» , но нИпонятнА =( |
||
lera01
13 — 19.07.16 — 13:59 |
(12) Чтобы организовать отбор по всем документам какого-то вида, в табличной части которых есть реквизит с нужным вам значением, нужно написать запрос. По результату запроса сформировать список ссылок на документы и засунуть их в отбор. |
||
Горогуля 14 — 19.07.16 — 13:59 |
(12) Фильтр работает не только по принципу Равно/Неравно |
Содержание:
1. Способы отбора строк в 1С
2. Варианты применения программного наложения отбора строк в 1С
1. Способы отбора строк в 1С
В данной статье обратимся к вопросу программного отбора строк по условию в таблице формы (управляемое приложение). Рассмотрим несколько способов выполнения подобной задачи:
1 способ:
Элемент управления формы «Таблица формы» связан с данными табличной части формы какого-либо объекта метаданных (например, Документа Заказ покупателя табличная часть – «Услуги»). Благодаря этому, при обращении на встроенном языке программирования к таблице формы (Элементы.<ИмяТаблицы>) становятся доступны методы расширения таблицы формы для табличных частей.
Если требуется выполнить отбор над строками табличной части формы которые видимы в таблице формы можно обратиться к методу расширения таблицы — «ОтборСтрок».
Для управляемых форм свойство «ОтборСтрок» может принимать значения – Фиксированная Структура или Неопределено.
Рассмотрим пример подобного действия:
//в таблице формы «Услуги» показывать строки, имеющих в поле «Номенклатура» указанную услуга, значение которой хранится в переменной ПеремУслуга:
Элементы.Услуги.ОтборСтрок = Новый ФиксированнаяСтруктура(«Номенклатура», ПеремУслуга);
Ключ структуры — имя реквизита табличной части формы, значение структуры – конкретное значение, по которому требуется осуществить отбор.
Для отмены отбора, свойству «ОтборСтрок» присваивается один из двух вариантов: значение Неопределено, либо ФиксированнаяСтруктура.
Дополнительно:
В случае, если после назначения отбора в табличной части формы меняется ход выполнения кода, то отбор нужно установить повторно, для его отработки и на измененных строках.
Отбор для строковых значений выполняется по условию вхождения значения. Например, если в колонке есть ячейки со значением «Партия 1», «Партия 2», …, «Партия 10», «Партия 11», … и устанавливается отбор по значению «Партия 1», то в таблицу будут отобраны строки со значениями «Партия 1», «Партия 10», «Партия 11» и т.д.
2 способ:
Свойство «ОтборСтрок» можно использовать и в случае расширения таблицы формы для таблицы значений, т.е. когда таблица формы не связана с табличной частью какого-либо объекта, а заполняется программно. В качестве ключа структуры нужно указать имя колонки таблицы значений. В качестве значения – значение, по которому осуществляется отбор.
3 способ:
Если таблица формы является динамическим списком (например, в форме списка справочника для вывода элементов справочника используется таблица формы с типом «Динамический список»), то используется свойство списка «Отбор». Динамический список — это интерфейсный объект и строится он на основе СКД. Поэтому тип значения, возвращаемого свойством «Отбор» будет – Отбор Компоновки Данных и заполняться он должен как в компоновке данных.
(в приведенном ниже примере переменная Список – реквизит формы)
//Элементы – коллекция элементов отбора
//метод Добавить() – добавляет новый элемент отбора и возвращает его значение.
ЭлОтбора = Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
//ИмяПоляКомпоновки в данном случае должно совпадать с именем колонки (реквизита) по //которой мы осуществляем отбор списка.
ЭлОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ИмяПоляКомпоновки»);
ЭлОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлОтбора.Использование = Истина;
ЭлОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
//Значение отбора
ЭлОтбора.ПравоеЗначение = ЗначениеПоляОтбора;
2. Варианты применения программного наложения отбора строк в 1С
Варианты применения:
Программное наложение отбора на табличную часть требуется, в основном, в двух случаях:
● Для предоставления пользователю дополнительных интерфейсных возможностей наложения отбора. Например, кнопка (команда), отбирающая строки с незаполненными важными реквизитами.
● В реализации задачи подчиненных табличных частей. Задача заключается в том, чтобы связать две ТЧ. И, например, при активизации строки в первой ТЧ, во второй – отображались, только строки, связанные с данной строкой первой ТЧ. Так же, при удалении строки из первой ТЧ, должны удаляться строки из второй ТЧ, связанные с ней. И т.д. Обязательным условием связи двух табличных частей, в данном случае, будет являться наличие в обоих одинакового реквизита (ключа), по которому и будет происходить связывание строк. Таких реквизитов может быть несколько. Тогда ключом связи будет комбинация значений из этих реквизитов.
В качестве примера взаимосвязанных табличных частей формы можно привести документ, регистрирующий время работы сотрудниками на технике за смену. В документе есть две ТЧ: «Сотрудники» и «Техника». В первой отображаются сотрудники, работавшие в конкретную смену, во второй — техника, на которой они работали. При активизации строки с сотрудником, в «Технике» должна отображаться только та техника, на которой работал данный сотрудник. В обоих табличных частях, присутствует реквизит-ключ «Сотрудник», на основании которого их строки связываются. Отбор на ТЧ «Техника» накладывается в Событии При Активизации Строки() Таблицы формы «Сотрудники», исполняемом при позиционировании одной из строк.
//При позиционировании на строке ТЧ «Сотрудники»: отображать только технику по текущему сотруднику
&НаКлиенте
Процедура СотрудникиПриАктивизацииСтроки(Элемент)
ТекДанные = Элементы.Сотрудники.ТекущиеДанные;
Если ТекДанные = Неопределено Тогда
//При активизации строки ТекДанные не заполонены, значит ТЧ «Сотрудники» — пустая
Элементы.Техника.ОтборСтрок = Неопределено;
Иначе
// Для ТЧ «Техника» устанавливаем отбор по текущему сотруднику
ТекСотрудник = ТекДанные.Сотрудник;
Элементы.Техника.ОтборСтрок = Новый ФиксированнаяСтруктура(«Сотрудник», ТекСотрудник);
КонецЕсли;
КонецПроцедуры
Специалист компании «Кодерлайн»
Марина Анапольская
Рассмотрим различные варианты установки отбора при выборе объекта на документе ДокументОтборПриемаТовара. У документа имеются следующие реквизиты (см. рисунок 1):
- ПоставщикОтбор (тип СправочникСсылка.Поставщики);
- ТоварОтбор (тип СправочникСсылка.Товары);
- ОтветственныйОтбор (тип СправочникСсылка.Ответственный);
- ПриемТовара (тип ДокументСсылка.ПриемТовара).
Рисунок 1. Структура документа ДокументОтборПриемаТовара |
Выбирать будем документ ПриемТовара, а отбор в форме выбора будет устанавливаться по реквизитам с постфиксом Отбор.
Документ ПриемТовара имеет реквизиты (см. рисунок 2):
- Поставщик (тип СправочникСсылка.Поставщики);
- Ответственный (тип СправочникСсылка.Ответственный);
- Комментарий (Тип Строка).
А так же табличную часть Товары, состоящую из реквизитов Товар (тип СправочникСсылка.Товары) и Количество (тип Число).
Рисунок 2. Структура документа ПриемТовара |
1. Установка отбора в свойствах реквизита объекта метаданных
Самый простой вариант отбора. Нужно всего лишь в свойствах реквизита «Связи параметров выбора» и «Параметры выбора» задать параметры выбора. Допустим, при выборе документа ПриемТовара, нужно в форме выбора показывать документы отобранные по поставщику и только проведенные. Для этого в связях параметров выбора задаем отбор по поставщику, а в параметрах выбора отбор только проведенных документов (см. рисунок 3).
Рисунок 3. Отбор в свойствах реквизита объекта метаданных |
Больше ничего делать не нужно, платформа сама завернет указанные параметры выбора в структуру (см. рисунок 4) и поместит её в параметр Отбор формы выбора, далее, анализируя данный параметр формы, платформа устанавливает отборы для динамического списка.
Рисунок 6. Значение параметра формы выбора Отбор |
2. Установка отбора в свойствах элемента формы
Такой же простой вариант как и первый, только те же самые свойства задаются для элемента формы (см. рисунок 5).
Рисунок 5. Отбор в свойствах элемента формы |
Свойства элемента формы имеют приоритет над свойствами реквизита объекта.
3. Установка собственного отбора при создании формы выбора на сервере
Усложним задачу и будем производить отбор документов по табличной части, а конкретно по товару в ней. Для этого в связях параметров выбора зададим связь, где параметр будет Товар (прям ручками пишем), а реквизит ТоварОтбор (см. рисунок 6).
Рисунок 6. Связь параметра Товар с реквизитом ТоварОтбор |
Именно такую задаем связь, так как более одной точки(.) в колонке Имя при написании параметра мы не можем использовать (платформенное ограничение), то есть написать «Отбор.Товары.Товар» мы не сможем.
Так как имя параметра мы задали вручную, то платформа его не поместит в параметр Отбор формы выбора, поэтому в форме выбора документа ПриемТовара в обработчике события ПриСозданииНаСервере напишем программный код, который будет обрабатывать наш параметр Товар и устанавливать отбор по реквизиту табличной части:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Товар = Неопределено;
ЭтотОбъект.Параметры.Свойство("Товар", Товар);
Если Товар <> Неопределено Тогда
ФиксОтбор = ЭтотОбъект.Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор;
ЭлементОтбора = ФиксОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товары.Товар");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Товар;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КонецПроцедуры
4. Программная установка параметров выбора
Так как у элемента формы есть свойства СвязиПараметровВыбора и ПараметрыВыбора, и они доступны не только для чтения, но и на запись, то все что описано выше можно выполнить с помощью программного кода. Для этого в форме документа ДокументОтборПриемаТовара в событии ПриСозданииНаСервере напишем код, который будет формировать массив связей параметров и параметров выбора, и устанавливать их в соответствующие свойства элемента формы ПриемТовара, который связан с реквизитом объекта ПриемТовара:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаем связи параметров выбора.
МассивСвязей = Новый Массив;
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Поставщик", "Объект.ПоставщикОтбор");
МассивСвязей.Добавить(НоваяСвязь);
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Ответственный", "Объект.ОтветственныйОтбор");
МассивСвязей.Добавить(НоваяСвязь);
НоваяСвязь = Новый СвязьПараметраВыбора("Товар", "Объект.ТоварОтбор");
МассивСвязей.Добавить(НоваяСвязь);
// Создаем параметры выбора.
МассивПараметров = Новый Массив;
НовыйПараметр = Новый ПараметрВыбора("Отбор.Проведен", Истина);
МассивПараметров.Добавить(НовыйПараметр);
// Устанавливаем связи параметров и параметры выбора для элемента формы.
Элементы.ПриемТовара.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
Элементы.ПриемТовара.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
КонецПроцедуры
Для корректной работы отборов необходимо создать событие ПриСозданииНаСервере с таким же программным кодом как в варианте №3 у формы выбора документа ПриемТовара.
5. Установка параметров выбора в момент начала выбора
Этот вариант позволяет «на лету» устанавливать параметры выбора. Усложним задачу и будем устанавливать отбор только по заполненным реквизитам отбора.
В модуле формы документа ДокументОтборПриемаТовара в событии НачалоВыбора для элемента ПриемТовара, который связан с реквизитом объекта ПриемТовара, напишем код, который будет устанавливать параметры выбора в зависимости от заполненности реквизитов отбора:
&НаКлиенте
Процедура ПриемТовараНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
МассивПараметров = Новый Массив;
Если ЗначениеЗаполнено(Объект.ПоставщикОтбор) Тогда
НовыйПараметр = Новый ПараметрВыбора("Отбор.Поставщик", Объект.ПоставщикОтбор);
МассивПараметров.Добавить(НовыйПараметр);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ОтветственныйОтбор) Тогда
НовыйПараметр = Новый ПараметрВыбора("Отбор.Ответственный", Объект.ОтветственныйОтбор);
МассивПараметров.Добавить(НовыйПараметр);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ТоварОтбор) Тогда
НовыйПараметр = Новый ПараметрВыбора("Товар", Объект.ТоварОтбор);
МассивПараметров.Добавить(НовыйПараметр);
КонецЕсли;
НовыйПараметр = Новый ПараметрВыбора("Отбор.Проведен", Истина);
МассивПараметров.Добавить(НовыйПараметр);
Элементы.ПриемТовара.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
КонецПроцедуры
Для корректной работы отборов необходимо создать событие ПриСозданииНаСервере с таким же программным кодом как в варианте №3 у формы выбора документа ПриемТовара.
6. Открытие формы выбора с установленным параметром формы Отбор в момент начала выбора
Данный способ отличается от предыдущего тем, что мы отменяем стандартную обработку события НачалоВыбора, сами формируем параметр формы Отбор, передаем его в открываемую форму выбора с указанием владельца формы, то есть все делаем за платформу. Обратите внимание, что в данном случае нам не нужно обходить ограничение платформы (больше одной точки в имени параметра), что бы установить отбор по товару в табличной части, достаточно указать параметр отбора Товары типа Структура, в котором ключом будет имя колонки «Товар», а значение ссылка на товар.
&НаКлиенте
Процедура ПриемТовараНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Отбор = Новый Структура;
Если ЗначениеЗаполнено(Объект.ПоставщикОтбор) Тогда
Отбор.Вставить("Поставщик", Объект.ПоставщикОтбор);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ОтветственныйОтбор) Тогда
Отбор.Вставить("Ответственный", Объект.ОтветственныйОтбор);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ТоварОтбор) Тогда
Отбор.Вставить("Товары", Новый Структура("Товар", Объект.ТоварОтбор));
КонецЕсли;
Отбор.Вставить("Проведен", Истина);
ПараметрыФормы = Новый Структура("Отбор", Отбор);
ОткрытьФорму("Документ.ПриемТовара.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Отборы на динамический список платформа наложит сама, писать дополнительно код больше не нужно, как в варианте №3.
А что будет, если отбор в связях параметров выбора и параметры выбора пересекаются?
Как показал мой эксперимент, страшного ничего не случится, платформа установит отбор по связям параметров выбора.
<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='
Related Posts
Получение логина и пароля техподдержки 1С из базы
Класс для вывода отчета в Excel
Счет-фактура для УПП
Библиотека классов для создания внешней компоненты 1С на C#
Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
Прайс-лист с артикулом в отдельной колонке
15 Comments
-
В запросе соединение надо в фигурные скобки заключить, иначе будете иметь соединение даже при отключенном отборе, что для динамических списков бывает болезненно. И вместо группировки лучше использовать «Различные». На производительность это скорее всего не повлияет, но смотрится лучше, и методически правильнее.
Reply ↓
-
Да, согласен. Спасибо за замечание.
Reply ↓
-
Вот оно, спасибо автору за раскрытие.
Reply ↓
-
Вроде как всегда хватало просто Ctrl + F на соответствующей табличной части и получим отбор по одному полю.
Ctrl + Q — отключение отбора.
Reply ↓
-
(4) mxm2, Верно, эти комбинации клавиш действительно управляют отбором табличной части самого документа, но здесь речь про журнал(список) документов, в котором нужно управлять отбором по полям реквизитов табличных частей документа.
Reply ↓
-
(5) Каюсь… Не въехал сразу. )
Reply ↓
-
Хорошо, доступно оформленная мысль. Автору спасибо. Для кого-то будет шпаркалкой.
Reply ↓
-
(1) Armando, вопрос сравнения производительности и выбора конструкций distinct (различные) и group by довольно часто поднимается и однозначного ответа на него нет. Уж больно все разнится на разных субд и разных запросах 🙂
Да, «различные» проще и красивее выглядит, но не всегда быстрее 🙂
Reply ↓
-
(8) nixel, я тоже точно не знаю. Надо план запроса смотреть. Просто привык, что вместе с группировкой используются агрегатные функции. А тут конкретно уникальные строки получить надо.
Reply ↓
-
-
Спасибо за статью! Но у меня почему-то пропадают значки документов в списке после указанных действий ((( Кто сталкивался с такой проблемой?
Reply ↓
-
(12) 7nightfly7, сложно диагностировать без скриншотика, картинки строк настраиваются в свойствах списка на закладке Использование (свойство ПутьКДаннымКартинкиСтроки обычно равно значению Список.СтандартнаяКартинка). Если же в списке использовалось свое собственное поле картинки, то нужно проследить, что реквизит списка, связанный с картинкой строк, присутствует в выбранных полях текста запроса.
Reply ↓
-
Столкнулся с тем, что при такой схеме не корректно работают отборы с условиями с НЕ (НЕ равно, НЕ в списке) для поля с табличной частью
Reply ↓
-
Просто
СГРУППИРОВАТЬ ПО
ДокументТабельУчетаРабочегоВремени.Ссылка
тоже замечательно работает
Reply ↓
-
Чуть было не изобрел велосипед! Спасибо автору ⭐
Reply ↓
Leave a Comment
Ваш адрес email не будет опубликован. Обязательные поля помечены *
Перейти к содержанию
Как установить отбор в табличной части программно
На чтение 2 мин Просмотров 8.1к. Опубликовано 21.06.2017
Иногда в зависимости от каких-то действий пользователя необходимо программно установить отбор в табличной части. Рассмотрим как это сделать.
Наиболее часто программно наложить отбор на табличную часть (ТЧ) требуется:
- Для предоставления пользователю дополнительных интерфейсных возможностей наложения отбора. Например, в документе «Пересчет товаров» флаг для отображения только строк, в которых есть расхождения.
- При использовании двух взаимосвязанных ТЧ. Т.е. когда при активизации строки в главной ТЧ, в подчиненной ТЧ выводятся только связанные с этой строкой данные. При таком подходе в обоих табличных частях должны быть колонки, по которым будет производиться связывание строк (ключ).
В качестве примера взаимосвязанных табличных частей можно привести обработку, в которой есть две ТЧ: «Контрагенты» и «Договоры». В первой отображаются контрагенты, во второй — договоры этих контрагентов. При активизации строки с контрагентом должен выводиться список договоров только текущего контрагента. Для связи двух ТЧ в каждой присутствует колонка-ключ «Контрагент», по которой производится связь. Отбор на ТЧ с договорами накладывается в событии ПриАктивизацииСтроки() при позиционировании на контрагенте.
Для наложения отбора на табличную часть используется расширение табличных частей — свойство ОтборСтрок, которое позволяет установить отбор по значению одной или нескольких колонок. Свойству ОтборСтрок может быть присвоено значение Неопределено или значение типа ФиксированнаяСтруктура. Значение Неопределено присваивается для снятия отборов. В случае использования фиксированной структуры в качестве ключа указывается имя реквизита ТЧ, а в качестве значения — значение для отбора.
Приведем примеры наложения отборов:
// В ТЧ "Товары" отображать только те строки, у которых в колонке "Отменено" содержится значение Ложь
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Отменено", Ложь);
// При позиционировании на строке ТЧ "Контрагенты" накладывать отбор на ТЧ "Договоры": отображать только договоры по текущему контрагенту
&НаКлиенте
Процедура КонтрагентыПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.Контрагенты.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
// ТЧ Контрагенты пустая
Элементы.Договоры.ОтборСтрок = Неопределено;
Иначе
// Для ТЧ Договоры устанавливаем отбор по текущему контрагенту
ТекущийКонтрагент = ТекущиеДанные.Контрагент;
Элементы.Договоры.ОтборСтрок = Новый ФиксированнаяСтруктура("Контрагент", ТекущийКонтрагент);
КонецЕсли;
КонецПроцедуры