Работа с контактной информацией в типовых конфигурациях Код 1C v 8.х // Исправляем значения Контактной Информации контрагента в Регистре сведений
Функция ОчиститьEmail(
Контрагент,
ТипКонтактнойИнформации,
ВидКонтактнойИнформации,
Представление
)
// #1 Создаем набор записей
НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
// #2 Отбираем (по измерениям)
НаборЗаписей.Отбор.Объект.Установить(Контрагент);
НаборЗаписей.Отбор.Тип.Установить(ТипКонтактнойИнформации);
НаборЗаписей.Отбор.Вид.Установить(ВидКонтактнойИнформации);
// #3 Читаем набор записей
НаборЗаписей.Прочитать();
// #4 редактируем в цикле каждую запись из набора
Для каждого СтрНабЗап Из НаборЗаписей Цикл
СтрНабЗап.Представление = "";
сообщить("" + Контрагент + " | "
+ ТипКонтактнойИнформации + " | "
+ ВидКонтактнойИнформации + " | "
+ Представление + " -> " + СтрНабЗап.Представление + " [Ok!]");
КонецЦикла;
// #5 Сохраняем набор записей
НаборЗаписей.Записать();
КонецФункции
// Получить таблицу значений
// Записи из Регистра Сведений КонтактнаяИнформация с некорректными Email
функция ПолучитьТЗ()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1000000
| КонтактнаяИнформация.Объект,
| КонтактнаяИнформация.Тип,
| КонтактнаяИнформация.Вид,
| КонтактнаяИнформация.Представление,
| (ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(1000))) как стрПредставление
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Тип = &Тип
| //И КонтактнаяИнформация.Вид = &Вид
| И (ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(1000))) <> &ПустоеЗначение
| И НЕ КонтактнаяИнформация.Представление ПОДОБНО &ШаблонEmail";
//Параметры запроса:
// Типы контактной информации
Запрос.УстановитьПараметр("Тип",Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
// пустая строка
Запрос.УстановитьПараметр("ПустоеЗначение","");// Строка
// критерий отбора для примера простой - строка содержит символ "@" - значит это почта
Запрос.УстановитьПараметр("ШаблонEmail","%@%");// Строка
Результат = Запрос.Выполнить();
//Выборка = Результат.Выбрать();
// результат запроса выгрузить в
// таблицу значений
ПлохиеEmailТЗ = Результат.Выгрузить();
Возврат ПлохиеEmailТЗ;
КонецФункции
Категория:
1С Общие вопросы - Обычные формы Программное изменение записей регистра сведений Код 1C v 8.х НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Контрагент);
НаборЗаписей.Прочитать();
Для каждого Запись из НаборЗаписей Цикл
Если Запись.Вид = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Телефон контрагента") Тогда
Запись.Представление = ЭлементыФормы.ПолеВводаТелефона.Значение;
КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать();
Категория:
Регистры сведений Динамический список ~ Как на управляемой форме разместить список регистра сведений с отбором? Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация)
1. Создание реквизита:
Добавляем новый реквизит формы (!!! не путать с реквизитом справочника !!!) с типом "ДинамическийСписок"
В поле "Основная таблица" выбираем нужный регистр сведений.
2. Отображение на форме:
Перетащить реквизит формы в элементы формы (c права налево
.
Так же для отображения необходимо задать хотя-бы одну колонку для вывода.
3. Настройка отбора:
В процедуре ПриСозданииНаСервере вручную устанавливаем необходимый отбор.
Пример:
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементОтбора = КонтактнаяИнформация.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
ЭлементОтбора.ПравоеЗначение = Объект.Ссылка;
КонецПроцедуры
Решение явно не единственное, так что если кто что накопает ещё - пишите ;)
Категория:
Работа с Формой (Диалог) и её элементами Оператор ВЫРАЗИТЬ, аналог методов Лев, Прав, СокрЛП в Запросе? Использовать конструкцию «
ВЫРАЗИТЬ »:
Код 1C v 8.х Запрос.Текст = "
…
|ГДЕ
| (ВЫРАЗИТЬ(ЕдиницыХранения.Владелец.Наименование КАК СТРОКА(4))) <> &Груз";
Запрос.УстановитьПараметр("Груз","Тонн");
С целью приведения строк неограниченной длины к строкам ограниченной длины рекомендуется использовать операцию приведения типа ВЫРАЗИТЬ() :
Код 1C v 8.х
ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1
Категория:
Запросы Функция ЗНАЧЕНИЕ Функция ЗНАЧЕНИЕ - Позволяет использовать прямо в текстах запроса предопределенные в конфигураторе данные. (т.е. позволяет избавиться от необходимости передавать их параметрами к запросу).
Использование предопределенных данных конфигурации
Например:
можно было бы написать в запросе:
Код 1C v 8.х | ВзаиморасчетыСПокупателямиОстатки.Проект = &ПроектыПустаяСсылка
а потом передать в запрос параметр:
Код 1C v 8.х Запрос.УстановитьПараметр("ПроектыПустаяСсылка", Справочник.Проекты.ПустаяСсылка());
А при помощи
ЗНАЧЕНИЕ будет так:
Код 1C v 8.х | ВзаиморасчетыСПокупателямиОстатки.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)
Примеры использования:
Код 1C v 8.х //ПРИМЕР 1 (Получение паспортный данных сотрудника)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Физлицо", Физлицо);
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ПаспортныеДанныеФизЛицСрезПоследних.ДокументВид,
| ПаспортныеДанныеФизЛицСрезПоследних.ДокументСерия,
| ПаспортныеДанныеФизЛицСрезПоследних.ДокументНомер,
| ПаспортныеДанныеФизЛицСрезПоследних.ДокументДатаВыдачи,
| ПаспортныеДанныеФизЛицСрезПоследних.ДокументКемВыдан,
| ПаспортныеДанныеФизЛицСрезПоследних.ДокументКодПодразделения,
| "","" + АдресаФактические.Поле1 + "","" + АдресаФактические.Поле2 + "","" + АдресаФактические.Поле3 + "","" + АдресаФактические.Поле4 + "","" + АдресаФактические.Поле5 + "","" + АдресаФактические.Поле6 + "","" + АдресаФактические.Поле7 + "","" + АдресаФактические.Поле8 + "","" + АдресаФактические.Поле9 КАК АдресФактический,
| "","" + АдресПрописки.Поле1 + "","" + АдресПрописки.Поле2 + "","" + АдресПрописки.Поле3 + "","" + АдресПрописки.Поле4 + "","" + АдресПрописки.Поле5 + "","" + АдресПрописки.Поле6 + "","" + АдресПрописки.Поле7 + "","" + АдресПрописки.Поле8 + "","" + АдресПрописки.Поле9 КАК АдресПоПрописке,
| ДомашниеТелефоны.Поле3 КАК ТелефонДомашний
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних(, ФизЛицо = &ФизЛицо) КАК ПаспортныеДанныеФизЛицСрезПоследних
| ПО ФизическиеЛица.Ссылка = ПаспортныеДанныеФизЛицСрезПоследних.ФизЛицо
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК ДомашниеТелефоны
| ПО ФизическиеЛица.Ссылка = ДомашниеТелефоны.Объект
| И (ДомашниеТелефоны.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонФизЛица))
| И (ДомашниеТелефоны.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон))
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК АдресаФактические
| ПО ФизическиеЛица.Ссылка = АдресаФактические.Объект
| И (АдресаФактические.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ФактАдресФизЛица))
| И (АдресаФактические.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК АдресПрописки
| ПО (ФизическиеЛица.Ссылка = АдресаФактические.Объект)
| И (АдресаФактические.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресФизЛица))
| И (АдресаФактические.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
|ГДЕ
| ФизическиеЛица.Ссылка = &Физлицо";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
АдресПроживания = Выборка.АдресФактический;
УдостоверениеЛичности = Строка(Выборка.ДокументВид)+"; "+Выборка.ДокументСерия+"; "+Выборка.ДокументНомер+"; "+Формат(Выборка.ДокументДатаВыдачи,"ДЛФ=D");
Телефон = Выборка.ТелефонДомашний;
КонецЕсли;
//ПРИМЕР 2
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВидыНоменклатуры.Ссылка как ссылка,
| ВидыНоменклатуры.Порядок
|ИЗ
| Перечисление.ВидыНоменклатуры КАК ВидыНоменклатуры
|ГДЕ
| ВидыНоменклатуры.Ссылка = Значение(Перечисление.ВидыНоменклатуры.Услуга) ";
ТЗ = Новый ТаблицаЗначений;
ТЗ = запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.Значение = ТЗ;
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
Категория:
Запросы Как проверить Тип поля в запросе? При составлении запроса для полей, имеющих составной тип данных, например, измерение "Объект" в регистре сведений "Контактная информация", часто возникает необходимость проверить тип значения этого поля.
Проверку можно выполнить с помощью оператора
ССЫЛКА
Код 1C v 8.х ВЫБРАТЬ Представление
ИЗ РегистрСведений.КонтактнаяИнформация
ГДЕ КонтактнаяИнформация.Объект ССЫЛКА Справочник.Контрагенты
Категория:
Запросы Функция ПОДСТРОКА() В языке запросов 1С:Предприятия функция
ПОДСТРОКА() в
формате ПОДСТРОКА(<Исходная строка>, <Начало>, <Длина>) может применяться к данным строкового типа и позволяет выделить фрагмент <Исходной строки>, начинающийся с символа номер <Начало> (символы в строке нумеруются с 1) и длиной <Длина> символов. Результат вычисления функции ПОДСТРОКА() имеет строковый тип переменной длины, причем длина будет считаться неограниченной, если <Исходная строка> имеет неограниченную длину и параметр <Длина> не является константой или превышает 1024.
Вычисление функции ПОДСТРОКА() на SQL сервере:
В клиент-серверном варианте работы функция ПОДСТРОКА() реализуется при помощи функции SUBSTRING() соответствующего оператора SQL, передаваемого серверу баз данных SQL Server, который вычисляет тип результата функции SUBSTRING() по сложным правилам в зависимости от типа и значений ее параметров, а так же в зависимости от контекста, в котором она используется.
В большинстве случаев эти правила не оказывают влияния на выполнение запроса 1С:Предприятия, однако есть случаи, когда для исполнения запроса существенна максимальная длина строки результата, вычисленная SQL Server. Важно иметь в виду, что в некоторых контекстах использования функции ПОДСТРОКА() максимальная длина ее результата может оказаться равной максимальной длине строки ограниченной длины, которая в SQL Server равна 4000 символам. Это может привести к неожиданному аварийному завершению выполнения запроса.
Например, запрос:
Код 1C v 8.х ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1
завершается аварийно с сообщением Ошибка СУБД:
Microsoft OLE DB Provider for SQL Server: Warning: The query processor could not produce a query plan from the optimizer because the total length of all the columns in the GROUP BY or ORDER BY clause exceeds 8000 bytes.
HRESULT=80040E14, SQLSTATE=42000, native=8618
Это происходит потому, что вычисленная Microsoft SQL Server максимальная длина строки, которая является результатом выражения:
Код 1C v 8.х ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
равна 4000 символов. Поэтому длина записи, состоящей из двух таких полей превышает 8000 байт, разрешенные для выполнения операции сортировки.
В связи с описанной особенностью исполнения функции SUBSTRING() на SQL Server использование функции ПОДСТРОКА() с целью приведения строк неограниченной длины к строкам ограниченной длины не рекомендуется. Вместо нее лучше использовать операцию приведения типа ВЫРАЗИТЬ(). В частности, приведенный пример можно переписать в виде:
Код 1C v 8.х ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1
Категория:
Запросы Как выбрать записи из регистра сведений? Код 1C v 8.х //ВНИМАНИЕ !!!
// В качестве полей для отбора могут задаваться измерения или реквизиты, для которых
// в конфигураторе признак индексирования установлен в значение "Индексировать" или
// установлен признак "Ведущее". Вид сравнения может быть только Равно.
// Пример 1 Периодический регистр сведений
Отбор = Новый Структура("Сотрудник");
Отбор.Сотрудник = Результат.Сотрудник;
ВыборкаОКЛАД = РегистрыСведений.ПлановыеНачисленияРаботниковОрганизаций.Выбрать(Результат.Период,ТекДата, Отбор);
// КРАТКИЙ ВАРИАНТ
ВыборкаОКЛАД = РегистрыСведений.ПлановыеНачисленияРаботниковОрганизаций.Выбрать(Результат.Период,ТекДата,Новый Структура("Сотрудник", Результат.Сотрудник));
СумОкл=0;
Пока ВыборкаОКЛАД.Следующий() Цикл
СумОкл=СумОкл+ВыборкаОКЛАД.Показатель1;
КонецЦикла;
// Пример 2 Непериодический регистр сведений
ВыборкаОРГ = РегистрыСведений.КонтактнаяИнформация.Выбрать(Новый Структура("Объект", Организация));
Пока ВыборкаОРГ.Следующий() Цикл
Если Строка(ВыборкаОРГ.Вид) = "Юридический адрес организации" Тогда
ЮрАдрес = ВыборкаОРГ.Представление;
ИначеЕсли Строка(ВыборкаОРГ.Вид) = "Телефон организации" Тогда
Телефон = ВыборкаОРГ.Представление;
КонецЕсли;
КонецЦикла;
Категория:
Регистры сведений Получить запросом контактную информацию одной строкой по Физ. лицу Для тех, кто мучается с получением сведений из регистра сведений КонтактнаяИнформация в стандартных конфигурациях.
Код 1C v 8.х //Нужно запросом получить контактные данные(ФИО, Адрес, Телефон) :
// ФизЛицо Адрес Телефон
// Иванов Петр Сергеевич 140943, Московская обл, Дзержинский г, Угрешская ул, дом № 3, кв.21
// Иванова Оксана Александровна 119672, Москва г, Краснобогатырская ул, дом № 2, корпус 4, кв.15 (499) 730-18-02
// Петрова Тамара Алексеевна 141257, Московская обл, Долгопрудный г, Молодежная ул, дом № 7, кв.3
// Сидорова Юлия Васильевна 107126, Москва г, Академика Анохина ул, дом № 12, кв.54 (495) 963-08-01
Запрос=Новый Запрос;
Запрос.Текст="
|ВЫБРАТЬ
| ВЗАдрес.Ссылка КАК ФизЛицо,
| ВЗАдрес.Адрес,
| ВЗТелефон.Телефон
|ИЗ
| (ВЫБРАТЬ
| ФизическиеЛица.Ссылка КАК Ссылка,
| КонтактнаяИнформация.Представление КАК Адрес
| ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
| ПО ФизическиеЛица.Ссылка = КонтактнаяИнформация.Объект
| ГДЕ
| КонтактнаяИнформация.Вид = &АдрПоПрописке
| И КонтактнаяИнформация.Тип = &Адрес) КАК ВЗАдрес
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ФизическиеЛица.Ссылка КАК Ссылка,
| КонтактнаяИнформация.Представление КАК Телефон
| ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
| ПО ФизическиеЛица.Ссылка = КонтактнаяИнформация.Объект
| ГДЕ
| КонтактнаяИнформация.Вид = &ВидТелеф
| И КонтактнаяИнформация.Тип = &Телефон) КАК ВЗТелефон
| ПО ВЗАдрес.Ссылка = ВЗТелефон.Ссылка
|
|УПОРЯДОЧИТЬ ПО
| ФизЛицо
|АВТОУПОРЯДОЧИВАНИЕ
|";
Запрос.УстановитьПараметр("Адрес",Перечисления.ТипыКонтактнойИнформации.Адрес);
Запрос.УстановитьПараметр("АдрПоПрописке",Справочники.ВидыКонтактнойИнформации.ЮрАдресФизЛица);
Запрос.УстановитьПараметр("ВидТелеф",Справочники.ВидыКонтактнойИнформации.ТелефонФизЛица);
Запрос.УстановитьПараметр("Телефон",Перечисления.ТипыКонтактнойИнформации.Телефон);
Результат = Запрос.Выполнить();
Результат = Результат.Выбрать();
Пока Результат.Следующий() Цикл
// обработка
КонецЦикла;
Категория:
Запросы