Всем элементам справочника установить реквизит

&НаСервере
Процедура СозданиеИИзменениеЭлементовИГруппСправочникаНаСервере()
 
    /// Как создать новый элемент справочника в 1с 8.3, 8.2
 
    // создадим новый элемент справочника Города
    // с именем Владивосток
    Владивосток = Справочники.Города.СоздатьЭлемент();
    Владивосток.Наименование = "Владивосток";
    Владивосток.Записать();
 
    /// Как создать новую группу справочника в 1с 8.3, 8.2
 
    // создадим новую группу справочника Города
    ГородаУМоря = Справочники.Города.СоздатьГруппу();
    ГородаУМоря.Наименование = "Города у моря";
    ГородаУМоря.Записать();
 
    /// Как перенести элемент справочника в другую группу в 1с 8.3, 8.2
 
    // перенесём созданный Владивосток в группу "Города у моря"
    Владивосток.Родитель = ГородаУМоря.Ссылка;
    Владивосток.Записать();
 
    /// Как внести изменения в элемент справочника по ссылке 
    /// в 1с 8.3, 8.2
 
    // найдём город Калькутта
    КалькуттаСсылка = Справочники.Города.НайтиПоНаименованию("Калькутта");
    Если Не КалькуттаСсылка.Пустая() Тогда
        // изменим и запишем численность жителей в городе
        Калькутта = КалькуттаСсылка.ПолучитьОбъект();
        Калькутта.Численность = 1000000;
        Калькутта.Записать();
    КонецЕсли;
 
    /// Как получить и проверить пустую ссылку типа справочник в 1с 8.3, 8.2
 
    ПустаяСсылка = Справочники.Города.ПустаяСсылка();
    Если ПустаяСсылка.Пустая() Тогда
        Сообщить("Ссылка действительно пустая.");
    КонецЕсли;
 
    /// Как узнать принадлежность элемента справочника группе
    /// с учетом уровней иерархии в 1с 8.3, 8.2
 
    ПермьСсылка = Справочники.Города.НайтиПоНаименованию("Пермь");
    РоссияСсылка = Справочники.Города.НайтиПоНаименованию("Россия");
 
    // проверим принадлежит ли город Пермь группе Россия
 
    Если ПермьСсылка.ПринадлежитЭлементу(РоссияСсылка) Тогда
        Сообщить("Элемент Пермь находится в группе Россия.");
    КонецЕсли;
 
    /// Как скопировать существующий элемент справочника в 1с 8.3, 8.2
 
    // скопируем элемент Пермь
 
    КопияПерми = ПермьСсылка.Скопировать();
    КопияПерми.Наименование = КопияПерми.Наименование + " КОПИЯ";
    КопияПерми.УстановитьНовыйКод();
    КопияПерми.Записать();
 
    /// Как выяснить уровень вложенности элемента справочника 
    /// в 1с 8.3, 8.2
 
    Сообщить(КопияПерми.Уровень()); // 1
 
    /// Как заблокировать элемент справочника перед изменениями 
    /// в 1с 8.3, 8.2
 
    // выполним блокировку элемента справочника
    // от изменения другими режимами или пользователями
 
    Пермь = ПермьСсылка.ПолучитьОбъект();
    Если Не Пермь.Заблокирован() Тогда
        Пермь.Заблокировать();
        // тут идёт какой-то долгий алгоритм
        // в результате которого мы меняем
        // заблокированный элемент
        Пермь.Численность = 5000;
        Пермь.Записать();
        // и только потом освобождаем его
        // для других режимов и пользователей
        Пермь.Разблокировать();
    КонецЕсли;
 
    /// Как заполнить новый элемент справочника на основании 
    /// в 1с 8.3, 8.2
 
    // в модуле справочника Города я определил процедуру
    // ОбработкаЗаполнения, которая обрабатывает ситуации
    // когда мы заполняем один элемент на основании
    // данных другого (см. в базе для скачивания)
 
    Хабаровск = Справочники.Города.СоздатьЭлемент();
    Хабаровск.Заполнить(
        Справочники.Города.НайтиПоНаименованию("Рио-де-Жанейро")
    );
    Хабаровск.Наименование = "Хабаровск";
    Хабаровск.Записать();
 
    /// Как пометить на удаление элемент справочника в 1с 8.3, 8.2
 
    // пометим на удаление только что созданный Хабаровск
    Хабаровск.УстановитьПометкуУдаления(
        Истина, // пометка удаления
        Ложь // включая подчиненные (если речь о группе справочника)
    );
    // метод Записать вызывать не нужно
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьКлиентаПоИмени(Имя)
    Возврат Справочники.Клиенты.НайтиПоНаименованию(Имя);
КонецФункции
 
/// Как открыть форму существующего элемента справочника 
/// по ссылке в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСуществующегоЭлементаСправочника(Команда)
 
    СсылкаНаЭлемент = ПолучитьКлиентаПоИмени("Андрей");
 
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаОбъекта", // имя формы
        ПараметрыФормы // параметры для формы
    );
 
КонецПроцедуры
 
/// Как открыть форму существующей группы справочника 
/// по ссылке в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСуществующейГруппыСправочника(Команда)
 
    СсылкаНаГруппу = ПолучитьКлиентаПоИмени("Vip");
 
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаГруппу);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаГруппы", // имя формы
        ПараметрыФормы // параметры для формы
    );
 
КонецПроцедуры
 
/// Как открыть форму выбора элемента справочника и
/// отследить её закрытие в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуВыбораЭлементаСправочника(Команда)
 
    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораЭлемента",
        ЭтотОбъект);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаВыбора",,,,,,ОповещениеОЗакрытии        
    );
 
КонецПроцедуры
 
&НаКлиенте
Процедура ПослеВыбораЭлемента(Результат, Параметры) Экспорт
 
    Если Результат <> Неопределено Тогда
        Сообщить("Был выбран элемент " + Результат);
    КонецЕсли;	
 
КонецПроцедуры
 
/// Как открыть форму выбора группы справочника и
/// отследить её закрытие в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуВыбораГруппыСправочника(Команда)
 
    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораГруппы",
        ЭтотОбъект);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаВыбораГруппы",,,,,,ОповещениеОЗакрытии        
    );
 
КонецПроцедуры
 
&НаКлиенте
Процедура ПослеВыбораГруппы(Результат, Параметры) Экспорт
 
    Если Результат <> Неопределено Тогда
        Сообщить("Была выбрана группа " + Результат);
    КонецЕсли;	
 
КонецПроцедуры
 
/// Как открыть форму списка справочника и
/// установить отбор по реквизиту в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормаСпискаСправочникаСОтбором(Команда)
 
    // откроем список клиентов, оставив
    // только мужчин
 
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Пол", ПолучитьПеречислениеМужской());
 
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаСписка",
        ПараметрыФормы
    );
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьПеречислениеМужской()
    Возврат Перечисления.Пол.Мужской;
КонецФункции
 
/// Как открыть форму списка справочника с нужным отображением
/// в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСпискаСправочникаСНужнымОтображением(Команда)
 
    // откроем список клиентов с отображением "Список"
 
    ФормаСписка = ПолучитьФорму("Справочник.Клиенты.ФормаСписка");    
    ФормаСписка.Открыть();
    ФормаСписка.Элементы.Список.Отображение = ОтображениеТаблицы.Список;
 
КонецПроцедуры
 
/// Как открыть форму только что созданного, но ещё
/// не записанного элемента справочника в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоСправочника(Команда)
 
    // получаем форму нового справочника
    ФормаНовогоСправочника = ПолучитьФорму(
        "Справочник.Еда.ФормаОбъекта",,, Истина); 
 
    // делаем копию её данных (так как напрямую их менять
    // нельзя)
    КопияДанныхФормы = ФормаНовогоСправочника.Объект;
 
    // заполняем эти данные на сервере
    ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы);
 
    // копируем заполненные данные в исходную форму
    КопироватьДанныеФормы(КопияДанныхФормы,
        ФормаНовогоСправочника.Объект);
 
    // показываем форму нового заполненного
    // элемента справочника пользователю
    ФормаНовогоСправочника.Открыть();
 
КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)
 
    // преобразуем данные формы в документ
    Еда = ДанныеФормыВЗначение(ДанныеФормы,
        Тип("СправочникОбъект.Еда")); 
 
    Еда.Наименование = "Груша";
    Еда.Калорийность = 500;
 
    // преобразуем документа обратно в данные формы
    ЗначениеВДанныеФормы(Еда, ДанныеФормы);
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере
  • Как создать элемент (группу) справочника?
  • Как найти элемент справочника?
  • Как удалить элемент справочника?
  • Как перебрать элементы справочника?
  • Как выбрать все элементы из определенной группы?
  • Как перебрать элементы подчиненного справочника с помощью запроса?
  • Как перебрать элементы подчиненного справочника с помощью выборки справочника?
  • Как открыть форму списка (элемента) справочника?
  • Как добавить запись в табличную часть элемента справочника?
  • Как удалить строки из табличной части справочника?
  • Как перебрать строки табличной части справочника?
  • Как создать элемент в нужной группе?
  • Как узнать, есть ли у текущего элемента подчиненные?
  • Как узнать количество подчиненных элементов у выбранного элемента справочника?
  • Как узнать количество подчиненных элементов у выбранного элемента справочника, если подчиненных справочников нексолько?
  • Как получить всех родителей выбранного элемента справочника?
  • Как получить запросом «полный» код элементов справочника, если тип кода — Строка?
  • Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?
  • Как найти все элементы справочника, в которых не заполнен строковый реквизит?
  • Как перенести все элементы справочника «Контрагенты» из одной группы в другую?
  • Как организовать программный выбор элемента справочника?
  • Как сохранить фотографию сотрудника в справочнике «Сотрудники»?

Как создать элемент (группу) справочника?

НовыйЭлемент = Справочники.ДокументыУдостоверяющиеЛичность.СоздатьЭлемент();
НовыйЭлемент.Наименование = "военный билет"; 
// Установить другие реквизиты.  
// .....
НовыйЭлемент.Записать(); 

НовыйЭлемент = Справочники.Банки.СоздатьЭлемент(); 
// Получить ссылку на группу, в которой будет находиться новый элемент
Родитель = Справочники.Банки.НайтиПоКоду("000000001"); 
НовыйЭлемент.Наименование = "АКБ"; 
НовыйЭлемент.Код = "000000011"; 
НовыйЭлемент.Родитель = Родитель; 
// Установить другие реквизиты 
// .....
НовыйЭлемент.Записать(); 

НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу(); 
// Получить ссылку на группу, в которой должна находиться создаваемая группа
Родитель = Справочники.Номенклатура.НайтиПоНаименованию("Обувь", Истина); 
НоваяГруппа.Наименование = "Модельная обувь"; 
НоваяГруппа.Родитель = Родитель; 
// Установить другие реквизиты  
// .....
НоваяГруппа.Записать(); 

// Создать новый элемент в корне справочника
НовыйЭлемент = Справочники.Подразделения.СоздатьЭлемент(); 
НовыйЭлемент.Наименование = "IT отдел";  
НовыйЭлемент.Записать(); 

// Получить ссылку на родителя для добавляемых элементов
Родитель = НовыйЭлемент.Ссылка; 
// Создать дочерний элемент. 
НовыйЭлемент = Справочники.Подразделения.СоздатьЭлемент(); 
НовыйЭлемент.Наименование = "Группа разработки"; 
НовыйЭлемент.Родитель = Родитель;  
НовыйЭлемент.Записать();

Как найти элемент справочника?

// Поиск по коду
РезультатПоиска = Справочники.Номенклатура.НайтиПоКоду("00030"); 
Если РезультатПоиска.Пустая() Тогда 
    // Выполнить действия, предусмотренные в случае, когда элемент не найден.  
КонецЕсли; 

// Поиск по наименованию
РезультатПоиска = Справочники.Номенклатура.НайтиПоНаименованию("Кроссовки"); 

// Поиск по реквизиту
РезультатПоиска = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", "К-120002");

Как удалить элемент справочника?

// Найти ссылки на удаляемый элемент. 
МассивСсылок = Новый Массив; 
МассивСсылок.Добавить(СсылкаНаУдаляемыйЭлемент); 
НайденныеСсылки = НайтиПоСсылкам(МассивСсылок); 

Если НайденныеСсылки.Количество() > 0 Тогда 
    Сообщить("Нельзя удалять элемент, на него имеются ссылки"); 
Иначе 
    УдаляемыйЭлемент = СсылкаНаУдаляемыйЭлемент.ПолучитьОбъект(); 
    УдаляемыйЭлемент.Удалить(); 
КонецЕсли; 

УдаляемыйЭлемент.УстановитьПометкуУдаления(Истина);

Как перебрать элементы справочника?

Выборка = Справочники.Номенклатура.ВыбратьИерархически(); 
Пока Выборка.Следующий() Цикл 
    Наименование = Выборка.Наименование; 
    // Обращение к другим данным справочника
    // .....
КонецЦикла; 

Запрос = Новый Запрос(
    "ВЫБРАТЬ 
    |    Ссылка, 
    |    Наименование 
    |ИЗ 
    |    Справочник.Номенклатура 
    |АВТОУПОРЯДОЧИВАНИЕ"
); 
Результат = Запрос.Выполнить().Выбрать(); 
Пока Результат.Следующий() Цикл 
    Наименование = Результат.Наименование;  
КонецЦикла;

Как выбрать все элементы из определенной группы?

Выборка = Справочники.Номенклатура.Выбрать(ПолеВводаРодитель); 
Пока Выборка.Следующий() Цикл 
    Наименование = Выборка.Наименование;
КонецЦикла; 

Запрос = Новый Запрос(
    "ВЫБРАТЬ 
    |    Ссылка, 
    |    Наименование 
    |ИЗ 
    |    Справочник.Номенклатура 
    |ГДЕ 
    |    Родитель = &Родитель 
    |АВТОУПОРЯДОЧИВАНИЕ"
); 
Запрос.УстановитьПараметр("Родитель", ПолеВводаРодитель); 
Результат = Запрос.Выполнить().Выбрать(); 
Пока Результат.Следующий() Цикл 
    Наименование = Результат.Наименование;  
КонецЦикла; 

Выборка=Справочники.Номенклатура.ВыбратьИерархически(ПолеВводаРодитель); 
Пока Выборка.Следующий() Цикл 
    Наименование = Выборка.Наименование;  
КонецЦикла; 

Запрос = Новый Запрос(
    "ВЫБРАТЬ 
    |    Ссылка, 
    |    Наименование 
    |ИЗ 
    |    Справочник.Номенклатура 
    |ГДЕ 
    |    Родитель В ИЕРАРХИИ(&Родитель) 
    |АВТОУПОРЯДОЧИВАНИЕ"
); 
Запрос.УстановитьПараметр("Родитель", ПолеВводаРодитель); 
Результат = Запрос.Выполнить().Выбрать(); 
Пока Результат.Следующий() Цикл 
    Наименование = Результат.Наименование;  
КонецЦикла;

Как перебрать элементы подчиненного справочника с помощью запроса?

Процедура ПереборПодчиненыхЭлементов(Контрагент) 
    Запрос = Новый Запрос(); 
    Запрос.Текст =
    "ВЫБРАТЬ 
    |    КонтактныеЛица.Ссылка 
    |ИЗ 
    |    Справочник.КонтактныеЛица КАК КонтактныеЛица 
    |ГДЕ 
    |    КонтактныеЛица.Владелец = &Владелец"; 
    Запрос.УстановитьПараметр("Владелец", Контрагент); 
    Результат = Запрос.Выполнить(); 
    Выборка = Результат.Выбрать(); 
    Пока Выборка.Следующий() Цикл 
        ОчереднойПодчиненый = Выборка.Ссылка; 
    КонецЦикла; 
КонецПроцедуры

Как перебрать элементы подчиненного справочника с помощью выборки справочника?

Процедура ПереборПодчиненыхЭлементов(Контрагент) 
    // Получить выборку по указанному контрагенту
    Выборка = Справочники.КонтактныеЛица.Выбрать( , Контрагент); 
    Пока Выборка.Следующий() Цикл 
        ОчереднойПодчиненый = Выборка.Ссылка; 
    КонецЦикла; 
КонецПроцедуры

Как открыть форму списка (элемента) справочника?

Форма = Справочники.Номенклатура.ПолучитьФормуСписка(); 
Форма.Открыть();

Элемент = Справочники.Номенклатура.НайтиПоКоду("00070"); 
Форма = Элемент.ПолучитьФорму(); 
Форма.Открыть();

Как добавить запись в табличную часть элемента справочника?

ЭлементОбъект = СсылкаКонтрагент.ПолучитьОбъект(); 
НоваяСтрока = ЭлементОбъект.ВидыДеятельности.Добавить(); 
// Заполнить реквизиты
НоваяСтрока.ВидДеятельности = ПолеВводаВидДеятельности; 
// .....
ЭлементОбъект.Записать();

Как удалить строки из табличной части справочника?

ЭлементСправочника = Справочники.Контрагенты.НайтиПоКоду("Ю0006"); 
ОбъектСправочника = ЭлементСправочника.ПолучитьОбъект(); 
ОбъектСправочника.ВидыДеятельности.Очистить(); 
ОбъектСправочника.Записать(); 

ОбъектСправочника = ВыбранныйЭлемент.ПолучитьОбъект(); 

// Создать структуру для отбора удаляемых строк
СтруктураОтбора = Новый Структура("ВидДеятельности", ВыбранныйВидДеятельности); 

// Получить массив удаляемых строк
ПодходящиеСтроки = ОбъектСправочника.ВидыДеятельности.НайтиСтроки(СтруктураОтбора); 

// Удалить строки
Для Каждого ОчереднаяСтрока Из ПодходящиеСтроки Цикл 
    ОбъектСправочника.ВидыДеятельности.Удалить(ОчереднаяСтрока); 
КонецЦикла; 

ОбъектСправочника.Записать();

Как перебрать строки табличной части справочника?

ЭлементСправочника = Справочники.Контрагенты.НайтиПоКоду("Ю0006"); 
Для Каждого ТекущаяСтрока Из ЭлементСправочника.ВидыДеятельности Цикл 
    Сообщить(ТекущаяСтрока.ВидДеятельности); 
КонецЦикла;

Как создать элемент в нужной группе?

КодГруппы = "330100"; 
ПоискПоПолномуКоду = Ложь; // значение по умолчанию 
Группа = Справочники.Номенклатура.НайтиПоКоду(КодГруппы, ПоискПоПолномуКоду); 

Если Группа.Пустая() Тогда 
    Группа = Справочники.Номенклатура.СоздатьГруппу(); 
    Группа.Код = КодГруппы; 
    Группа.Наименование = "Загруженные"; 
    Группа.Записать(); 
ИначеЕсли НЕ Группа.ЭтоГруппа Тогда 
    Сообщить("Найден элемент справочника с указанным кодом!"); 
    // Предусмотреть прерывание алгоритма...
КонецЕсли; 

Спр = Справочники.Номенклатура.СоздатьЭлемент(); 
Спр.Наименование = "Программно созданный"; 
// Реквизиты заполняются в соответствии с задачей
// .....
Спр.Родитель = Группа.Ссылка; 
Спр.Записать(); 

Группа = Справочники.Номенклатура.Загруженные; 

КодЭлемента = "330100"; 
ПоискПоПолномуКоду = Ложь; // Значение по умолчанию 
Родитель = Справочники.Номенклатура.НайтиПоКоду(КодЭлемента, ПоискПоПолномуКоду); 

Если Родитель.Пустая() Тогда 
Родитель = Справочники.Номенклатура.СоздатьЭлемент(); 

Родитель.Код = КодЭлемента; 
Родитель.Наименование = "Загруженные"; 

Родитель.Записать(); 
КонецЕсли; 

Спр = Справочники.Номенклатура.СоздатьЭлемент(); 
Спр.Наименование = "Программно созданный"; 
// Реквизиты заполняются в соответствии с задачей
// .....
Спр.Родитель = Родитель.Ссылка; 
Спр.Записать();

Как узнать, есть ли у текущего элемента подчиненные?

Выборка = Справочники.Номенклатура.Выбрать( , Владелец); 
Если Выборка.Следующий() = Истина Тогда 
    // Есть подчиненные элементы.
КонецЕсли;

Запрос = Новый Запрос(); 
Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1 
    |    ЕдиницыИзмерения.Ссылка 
    |ИЗ 
    |    Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения 
    |ГДЕ 
    |    ЕдиницыИзмерения.Владелец = &Владелец"; 
Запрос.УстановитьПараметр("Владелец", Владелец); 
Если НЕ Запрос.Выполнить().Пустой() Тогда 
    // Есть подчиненные элементы!
КонецЕсли;

Как узнать количество подчиненных элементов у выбранного элемента справочника?

Выборка = Справочники.ЕдиницыИзмерения.Выбрать( , Владелец); 
КоличествоЭлементов = 0; 
Пока Выборка.Следующий() Цикл 
    КоличествоЭлементов = КоличествоЭлементов + 1; 
КонецЦикла; 

Запрос = Новый Запрос(); 
Запрос.Текст =
    "ВЫБРАТЬ 
    |    КОЛИЧЕСТВО(*) КАК КоличествоЗаписей 
    |ИЗ 
    |    Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения 
    |ГДЕ 
    |    ЕдиницыИзмерения.Владелец = &Владелец"; 
Запрос.УстановитьПараметр("Владелец", Владелец); 
Выборка = Запрос.Выполнить().Выбрать(); 

Если Выборка.Следующий() Тогда 
    КоличествоЗаписей = Выборка.КоличествоЗаписей; 
КонецЕсли;

Как узнать количество подчиненных элементов у выбранного элемента справочника, если подчиненных справочников несколько?

ВЫБРАТЬ
    СУММА(КоличествоПодчиненных) КАК КоличествоПодчиненныхЭлементов 
ИЗ 
    (ВЫБРАТЬ 
        КОЛИЧЕСТВО(*) КАК КоличествоПодчиненных 
    ИЗ 
        Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения 
    ГДЕ
        ЕдиницыИзмерения.Владелец = &Владелец 

    ОБЪЕДИНИТЬ ВСЕ 

    ВЫБРАТЬ 
        КОЛИЧЕСТВО(*) 
    ИЗ 
        Справочник.СерииНоменклатуры КАК СерииНоменклатуры 
    ГДЕ
        СерииНоменклатуры.Владелец = &Владелец
    ) КАК ВложенныйЗапрос

Как получить всех родителей выбранного элемента справочника?

МассивРодителей = Новый Массив; 
Родитель = СсылкаНаЭлемент.Родитель; 

Пока НЕ Родитель.Пустая() Цикл
    МассивРодителей.Добавить(Родитель);
    Родитель = Родитель.Родитель; 
КонецЦикла; 

Для Каждого ТекущийРодитель Из МассивРодителей Цикл
    // Работа с текущим родителем
КонецЦикла;
ВЫБРАТЬ 
    Номенклатура.Ссылка КАК Ссылка 
ИЗ 
    Справочник.Номенклатура КАК Номенклатура 
ГДЕ 
    Номенклатура.Ссылка = &Ссылка 
ИТОГИ ПО 
    Ссылка ТОЛЬКО ИЕРАРХИЯ 
ТекущийЭлементНоменклатуры = ЭлементНоменклатура; 

Запрос = Новый Запрос(
    "ВЫБРАТЬ 
    |    Номенклатура.Родитель, 
    |    Номенклатура.Родитель.Родитель, 
    |    Номенклатура.Родитель.Родитель.Родитель, 
    |    Номенклатура.Родитель.Родитель.Родитель.Родитель, 
    |    Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель 
    |ИЗ 
    |    Справочник.Номенклатура КАК Номенклатура 
    |ГДЕ 
    |    Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры"; 

Пока Истина Цикл 
    Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", ТекущийЭлементНоменклатуры); 
    Результат = Запрос.Выполнить(); 
    Если Результат.Пустой() Тогда 
        Прервать; 
    КонецЕсли; 
    Выборка = Результат.Выбрать(); 
    Выборка.Следующий(); 

    Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл 
        ТекущийЭлементНоменклатуры = Выборка[НомерКолонки]; 
        Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда 
            Прервать; 
        Иначе 
            Сообщить(ТекущийЭлементНоменклатуры); 
        КонецЕсли; 
    КонецЦикла; 

    Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда 
        Прервать;
    КонецЕсли; 
КонецЦикла;

Как получить запросом «полный» код элементов справочника, если тип кода — Строка?

ВЫБРАТЬ 
    Контрагенты.Ссылка, 
    ВЫБОР 
        КОГДА (Контрагенты.Родитель.Код ЕСТЬ NULL ) ТОГДА Контрагенты.Код 
        КОГДА (Контрагенты.Родитель.Родитель.Код ЕСТЬ NULL ) ТОГДА 
            Контрагенты.Родитель.Код + "/" + Контрагенты.Код 
        ИНАЧЕ Контрагенты.Родитель.Родитель.Код + "/" + Контрагенты.Родитель.Код + 
            "/" + Контрагенты.Код 
    КОНЕЦ КАК ПолныйКод 
ИЗ 
    Справочник.Контрагенты КАК Контрагенты

Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?

Запрос = Новый Запрос(
    "ВЫБРАТЬ 
    |    Контрагенты.Ссылка КАК Ссылка 
    |ИЗ 
    |    Справочник.Контрагенты КАК Контрагенты 
    |ГДЕ 
    |    (Контрагенты.Наименование ПОДОБНО &ЧастьНаименования) И (НЕ Контрагенты.ЭтоГруппа) 
    |ИТОГИ ПО 
    |    Ссылка ТОЛЬКО ИЕРАРХИЯ"
); 
Запрос.УстановитьПараметр("ЧастьНаименования", "%" + ПолеВводаПодстрока + "%");

Как найти все элементы справочника, в которых не заполнен строковый реквизит?

ВЫБРАТЬ 
    ФизическиеЛица.Ссылка 
ИЗ 
    Справочник.ФизическиеЛица КАК ФизическиеЛица 
ГДЕ 
    (ФизическиеЛица.ИНН = "") 

ВЫБРАТЬ 
    ФизическиеЛица.Ссылка 
ИЗ 
    Справочник.ФизическиеЛица КАК ФизическиеЛица 
ГДЕ 
    (ФизическиеЛица.СтраховойНомерПФР = "") ИЛИ (ФизическиеЛица.СтраховойНомерПФР = " - -")

Как перенести все элементы справочника «Контрагенты» из одной группы в другую?

Запрос = Новый Запрос; 
Запрос.Текст =
    "ВЫБРАТЬ 
    |    Контрагенты.Ссылка 
    |ИЗ 
    |    Справочник.Контрагенты КАК Контрагенты 
    |ГДЕ 
    |    Контрагенты.Родитель = &СтарыйРодитель"; 
Запрос.УстановитьПараметр("СтарыйРодитель", СтарыйРодитель); 
Результат = Запрос.Выполнить(); 

Выборка = Результат.Выбрать(); 
Пока Выборка.Следующий() Цикл 
    Контрагент = Выборка.Ссылка.ПолучитьОбъект(); 
    Контрагент.Родитель = НовыйРодитель; 
    Контрагент.Записать(); 
КонецЦикла;

Как организовать программный выбор элемента справочника?

// Получить форму выбора справочника как подчиненную форме документа 
ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , ЭтаФорма); 

// Открыть полученную форму 
ФормаВыбора.Открыть(); 

Процедура ОбработкаВыбора(ЗначениеВыбора, Источник) 
    ПолученноеЗначение = ЗначениеВыбора; 
    // Дальнейшая обработка значения...
КонецПроцедуры 

ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , ЭтаФорма); 
Выбрано = ФормаВыбора.ОткрытьМодально(); 

Процедура ПолеВводаНачалоВыбора(Элемент, СтандартнаяОбработка) 
    // Запретить стандартную обработку. 
    СтандартнаяОбработка = Ложь; 
    // Получить форму выбора справочника как подчиненную полю ввода
    ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , Элемент); 
    // Открыть полученную форму 
    ФормаВыбора.Открыть(); 
КонецПроцедуры 

Процедура ПолеВводаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) 
    // Отключить стандартную обработку (при необходимости)
    СтандартнаяОбработка = Ложь; 
    ПолученноеЗначение = ВыбранноеЗначение; 
    // Дальнейшая обработка значения...
КонецПроцедуры

Как сохранить фотографию сотрудника в справочнике «Сотрудники»?

Процедура ЗагрузитьФотографию(Элемент)
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
    Фильтр = "Текст (*,*)|*.*";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите картинку";
    Если ДиалогОткрытияФайла.Выбрать() Тогда 
        ВыбраннаяКартинка = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла);
        ЭлементХранилища = Новый ХранилищеЗначения(ВыбраннаяКартинка);
        Фотография = ЭлементХранилища;
    КонецЕсли;
КонецПроцедуры

ВыбФайл = Новый ДвоичныеДанные(ДиалогОткрытияФайла.ПолноеИмяФайла);
элХранилища = Новый ХранилищеЗначения(ВыбФайл);
Фотография = элХранилища;

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

Групповое изменение реквизитов в списках документов и списках справочников

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

Заключается она в том, что вы можете находясь прямо в списке документов или списке справочника выделить нужные элементы зажав кнопку «Shift» или «Ctrl» и щелкая по ним мышью. А затем нажать на правую кнопку мыши и в выпавшем меню нажать «Изменить выделенные».

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

Например в конфигурациях УТ 11 и Бухгалтерия 3.0 она находится в меню НСИ и Администрирование/ Обслуживание/ Корректировка данных/ Групповое изменение реквизитов.

Администрирование

Меню Администрирование

Т.е. по сути данная обработка в 1C 8.3 называется «Групповое изменение реквизитов».

Обслуживание

Меню Обслуживание

Как поменять реквизит сразу в нескольких элементах справочника/документах?

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

  1. Открываем обработку и указываем в ней, что мы хотим менять справочник номенклатура

    Выбор элементов для изменения

    Выбор справочника

  2. Задаем отбор для элементов которые мы будем менять. Для этого нужно нажать на ссылку «Все элементы», после чего вам откроется окно в котором можно задать параметры отбора. В нашем случае, это все элементы номенклатуры в которых ставка НДС 18 %. Добавим это условие по кнопке «Добавить условие отбора». И нажмем ОК для того чтобы этот отбор применился.

    Отбор

    Условия отбора

  3. Далее нам нужно задать на что мы собираемся поменять данный реквизит. Ищем в таблице реквизитов нужный реквизит, в нашем примере — Ставка НДС. И задаем его новое значение — 20 %.

    Значение реквизита

    Новое значение реквизита

  4. Теперь нам осталось только нажать на кнопку «Изменить реквизиты» и дождаться завершения работы обработки. После чего мы увидим вот такую надпись.

    Реквизиты изменены

    Окончание работы обработки

    Готово, реквизиты изменены. Обработка сэкономила нам кучу времени. Только представьте себе сколько времени вы бы вручную меняли 195 элементов:)

Как поменять (заполнить) значения дополнительного реквизита справочника/документа?

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

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

    Отбор

    Условия отбора

  2. Далее ищем в списке наш дополнительный реквизит и задаем ему нужное значение:

    Новое значение

    Новое значение доп. реквизита

  3. Далее проделываем то же самое для заполнения дополнительного реквизита в номенклатуре следующей категории.

Готово — вы проставили значения дополнительных реквизитов во всей номенклатуре и не потратили много времени.

Как поменять реквизит в табличной части документа/справочника?

Рассмотрим также на примере — допустим вы что-то перепутали и в течение длительного времени выбирали не ту номенклатуру в документах, как теперь это исправить? Это также можно сделать при помощи групповой обработки. Если вы хотите менять реквизиты в документах или их табличных частях — сначала нужно отменить проведение этих документов, иначе сменить реквизит не удастся.

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

    Выбор документов

    Выбор типа документов для изменения

  2. Далее мы задаем отбор — отобрать все реализации — где в табличной части Товары наша ошибочно выбранная номенклатура:

    Отбор

    Отбор для табличной части

  3. Нажимаем ОК и на вкладке «Товары» задаем ту номенклатуру на которую нужно заменить.

    Новый реквизит

    Новый реквизит табличной части

  4. Нажимаем «Изменить реквизиты» и дожидаемся окончания работы обработки.
  5. Проводим документы.

Готово — мы поменяли реквизит в табличной части документа и сделали все это автоматически! Если вы хотите узнать какие еще есть обработки, которые могут облегчить вам жизнь, записывайтесь на мой онлайн курс — «Сам себе Программист 1С»).

На чтение 6 мин Просмотров 11.1к. Опубликовано 26.04.2017

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

  • Создание элемента справочника
  • Поиск элементов справочника
  • Изменение элементов справочника
  • Удаление элементов справочника
  • Обход элементов справочника
  • Выбор элементов справочника запросом
  • Открытие форм справочника

Содержание

  1. Создание элемента справочника
  2. Поиск элементов справочника
  3. Изменение элементов справочника
  4. Удаление элементов справочника
  5. Обход элементов справочника
  6. Выбор элементов справочника запросом
  7. Открытие форм справочника

Создание элемента справочника

Создание новых элементов и групп справочника производится с помощью программного объекта СправочникМенеджер.<Имя справочника>. Данный объект доступен только на сервере.
Создание нового элемента или группы справочника состоит из следующих этапов:

  1. Создание элемента или группы;
  2. Заполнение владельца (если справочник подчиненный);
  3. Заполнение родителя (если справочник иерархический);
  4. Заполнение наименования и реквизитов (если не задана автоматическая нумерация, то и кода);
  5. Заполнение табличных частей;
  6. Запись элемента.

Создание новой группы:
НоваяГруппа = Справочники.Контрагенты.СоздатьГруппу(); // Создание группы
НоваяГруппа.Наименование = "Покупатели"; // Заполнение наименования
НоваяГруппа.Записать
(); // Запись группы

Создание нового элемента:
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент(); // Создание элемента
НовыйЭлемент.Родитель = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели"); // Заполнение родителя
НовыйЭлемент.Наименование = "Ромашка ООО"; // Заполнение наименования
НовыйЭлемент.ИНН = "123456789"; // Заполнение реквизита

// Добавление новой строки табличной части
НоваяСтрока = НовыйЭлемент.КонтактнаяИнформация.Добавить();
НоваяСтрока.Тип = "Адрес";
НоваяСтрока.Представление = "Москва";

НовыйЭлемент.Записать(); // Запись элемента

Поиск элементов справочника

Для поиска элементов справочников в языке программирования 1С предусмотрено несколько методов:

  • НайтиПоКоду(<Код>, <ПоискПоПолномуКоду>, <Родитель>, <Владелец>)
  • НайтиПоНаименованию(<Наименование>, <ТочноеСоответствие>, <Родитель>, <Владелец>)
  • НайтиПоРеквизиту(<ИмяРеквизита>, <ЗначениеРеквизита>, <Родитель>, <Владелец>)

Во всех методах если поиск успешный, то будет возвращена ссылка на найденный элемент.
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123"); // Поиск контрагента с кодом "123"
НайденныйДоговор = Справочники.ДоговорыКонтрагентов.НайтиПоКоду("1", , , НайденныйКонтрагент); // Поиск подчиненного найденному контрагенту договора с номером "1"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели"); // Поиск элемента с наименованием "Покупатели"
НайденныйКонтрагент1 = Справочники.Контрагенты.НайтиПоНаименованию("Ромашка ООО", , НайденныйКонтрагент); // Поиск элемента с наименованием "Ромашка ООО" в группе "Покупатели"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту
("ИНН", "123456789"); // Поиск контрагента с ИНН "123456789"

Изменение элементов справочника

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

  1. Получить объект элемента справочника (метод ПолучитьОбъект(), возвращает тип СправочникОбъект.<Имя справочника>);
  2. Присвоить новые значения реквизитам объекта;
  3. Записать объект элемента справочника.

Программное изменение справочника возможно только на стороне сервера.

Например, на форму обработки выведен реквизит Номенклатура типа СправочникСсылка.Номенклатура. Вот пример кода, изменяющего наименование выбранной пользователем номенклатуры:
НоменклатураОбъект = Номенклатура.ПолучитьОбъект();
НоменклатураОбъект.Наименование = "Новое наименование";
НоменклатураОбъект.Записать();

Удаление элементов справочника

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

Непосредственное удаление – операция необратимая, в то время как пометку на удаление можно отменить. Пометка на удаление хранится в предопределенном реквизите ПометкаУдаления. В пользовательском режиме помеченные на удаление элементы и группы справочника помечаются красным крестиком.

Пометку на удаление можно установить/снять двумя разными способами:
// Способ 1. Использование метода УстановитьПометкуУдаления()
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123");
КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.УстановитьПометкуУдаления(Истина);

// Способ 2. Изменение свойства ПометкаУдаления
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123");
КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.ПометкаУдаления = Истина;
КонтрагентОбъект.Записать();

Пример непосредственного удаления элемента справочника:
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123");
КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.Удалить
();

Обход элементов справочника

Для обхода элементов справочника в языке программирования 1С предусмотрено два метода:

  • Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>)
  • ВыбратьИерархически(<Родитель>, <Владелец>, <Отбор>, <Порядок>)

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

Рассмотрим примеры обхода элементов справочника:
// Обход всех элементов справочника Контрагенты
Выборка = Справочники.Контрагенты.Выбрать(); // Получение выборки всех элементов справочника
Пока Выборка.Следующий() Цикл
//действия с очередным элементом
Сообщить(Выборка.Наименование);
КонецЦикла;

// Обход контрагентов из группы "Покупатели"
ГруппаПокупатели = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели");
Выборка = Справочники.Контрагенты.Выбрать(ГруппаПокупатели);
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;

// Обход договоров контрагента "Ромашка ООО"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("Ромашка ООО");
Выборка = Справочники.ДоговорыКонтрагентов.Выбрать(, НайденныйКонтрагент);
Пока
Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;

// Обход контрагентов с пустым ИНН
// Реквизит ИНН должен быть проиндексирован!
Отбор = Новый Структура("ИНН", ""); // Структура может содержать только один элемент
Выборка = Справочники.Контрагенты.Выбрать(, , Отбор);
Пока
Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;

Выбор элементов справочника запросом

Поиск данных в базе 1С предпочтительнее выполнять при помощи запросов. Запрос позволяет описать практически любые условия для отбора, в отличие от методов Выбрать() и ВыбратьИерархически(), на которые накладываются существенные ограничения. К тому же, в большинстве случаев работа с использованием запросов быстрее, чем работа с использованием программного кода.

Простой пример поиска и вывода товаров со стоимостью больше 1000:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Наименование
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Стоимость > 1000"
;
Выборка = Запрос.Выполнить().Выбрать();
Пока
Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование
);
КонецЦикла;

Открытие форм справочника

Для открытия любых форм справочников рекомендуется использовать метод
ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)

Для открытия формы элемента или группы справочника также возможно использовать более простой метод
ПоказатьЗначение(<ОписаниеОповещенияОЗавершении>, <Значение>)

Кроме методов ОткрытьФорму() и ПоказатьЗначение() есть и другие (ОткрытьФормуМодально, ОткрытьЗначение, ПолучитьФорму), но их использование не рекомендуется, т.к. часть этих методов использует режим модального открытия, часть противоречит свежим рекомендациям фирмы 1С.

Приведем примеры программного открытия форм справочника:
// Открыть форму списка
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка");

// Открыть форму элемента
// Контрагент – реквизит формы, заполняемый пользователем интерактивно

ПоказатьЗначение(, Контрагент);

// Еще один способ открытия формы элемента
ПараметрыОткрытия = Новый Структура("Ключ", Контрагент);
ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭлемента", ПараметрыОткрытия);

// Открыть форму группы
// ГруппаКонтрагентов– реквизит формы, заполняемый пользователем интерактивно

ПоказатьЗначение(, ГруппаКонтрагентов);

// Еще один способ открытия формы группы
ПараметрыОткрытия = Новый Структура("Ключ", ГруппаКонтрагентов);
ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаГруппы", ПараметрыОткрытия);


Внимание!

Следует понимать, что интерактивная работа (в том числе открытие форм) в 1С возможна только на стороне клиента. В то же время поиск и изменение данных возможны только на стороне сервера.

Как записать программно значение в реквизит элемента справочника?

Я
   Parti

03.09.09 — 09:08

В табличной части обработки есть колонки ГруппаМатериалов и СтавкаНДС.

Группу материалов я получаю запросом кнопки «Выполнить», там выводятся группы спр Материалы. Ставки НДС в обработке проставляются пользователем вручную всей группе и по кнопке «Назначить» должны записаться всем элементам этой группы.

Вот обработка кнопки «Назначить»:

Процедура НазначитьНажатие1(Элемент)

   Запрос = Новый Запрос();

Запрос.Текст = «ВЫБРАТЬ

|    Материалы.Ссылка КАК Материал

|ИЗ

|    Справочник.Материалы КАК Материалы

|ГДЕ

|    Материалы.Наименование = &группа

|    И Материалы.ЭтоГруппа = ЛОЖЬ»;

Для каждого СтрГруппа ИЗ СписокГрупп Цикл

Запрос.УстановитьПараметр(«Группа»,СтрГруппа.Наименование);    

РезультатЗапроса=Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

   Справочники.Материалы.НайтиПоНаименованию(Выборка.Материал).СтавкаНДС = СтрГруппа.СтавкаНДС;

КонецЦИкла;

КонецЦИкла;

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

__

Почему значение реквизита СТавкаНДС не записывается в элементы группы?

  

Партнерская программа EFSOL Oblako

   ТелепатБот

1 — 03.09.09 — 09:08

   Stepa86

2 — 03.09.09 — 09:10

Чем ссылка от объекта отличается знаешь?

   CrazyBear

3 — 03.09.09 — 09:12

Пока Выборка.Следующий() Цикл
   СпрОбъект = Выборка.Материал.ПолучитьОбъект();
   СпрОбъект.СтавкаНДС = СтрГруппа.СтавкаНДС;
   Попытка
       СпрОбъект.Записать();
   Исключение
       Сообщить (ОписаниеОшибки);
   КонецПопытки
КонецЦИкла;

   Parti

4 — 03.09.09 — 09:15

(3)не работает.. и ошибку не выдает и в справочник не записывает..

   Parti

5 — 03.09.09 — 09:19

Процедура НазначитьНажатие1(Элемент)

   Запрос = Новый Запрос();

Запрос.Текст = «ВЫБРАТЬ

              |    Материалы.Ссылка КАК Материал

              |ИЗ

              |    Справочник.Материалы КАК Материалы

              |ГДЕ

              |    Материалы.Наименование = &группа

              |    И Материалы.ЭтоГруппа = ЛОЖЬ»;

Для каждого СтрГруппа ИЗ СписокГрупп Цикл

Запрос.УстановитьПараметр(«Группа»,СтрГруппа.Наименование);    

РезультатЗапроса=Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

   СпрОбъект = Выборка.Материал.ПолучитьОбъект();

   СпрОбъект.СтавкаНДС = СтрГруппа.СтавкаНДС;

   Попытка

       СпрОбъект.Записать();

   Исключение

       Сообщить (ОписаниеОшибки());

   КонецПопытки

КонецЦИкла;

КонецЦИкла;

__

не записывает((

   Parti

6 — 03.09.09 — 09:24

хелп

   Parti

7 — 03.09.09 — 09:29

Отладчик показывает, что не выполняется цикл

Пока Выборка.Следующий() Цикл

почему это может быть?

   yuraskas

8 — 03.09.09 — 09:31

Может быть что запрос пустой.

   Stepa86

9 — 03.09.09 — 09:32

потому что неправильно написан запрос

   SuperMario

10 — 03.09.09 — 09:32

(7) потому что ставить условие в запросе как в (0) = уродство.

   Parti

11 — 03.09.09 — 09:33

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

   Parti

12 — 03.09.09 — 09:39

(10) а ты как предлагаешь?

   Parti

13 — 03.09.09 — 09:46

Запрос.УстановитьПараметр(«Группа»,СокрЛП(СтрГруппа.Наименование));

так заработало) всем спс

   SuperMario

14 — 03.09.09 — 09:47

Процедура НазначитьНажатие1(Элемент)

   Запрос = Новый Запрос();

Запрос.Текст = «ВЫБРАТЬ

              |    Материалы.Ссылка КАК Материал

              |ИЗ

              |    Справочник.Материалы КАК Материалы

              |ГДЕ

              |    Материалы.Ссылка В ИЕРАРХИИ (&группа)

              |    И Материалы.ЭтоГруппа = ЛОЖЬ»;

Для каждого СтрГруппа ИЗ СписокГрупп Цикл

Запрос.УстановитьПараметр(«Группа»,СтрГруппа.Ссылка);    

РезультатЗапроса=Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

   СпрОбъект = Выборка.Материал.ПолучитьОбъект();

   СпрОбъект.СтавкаНДС = СтрГруппа.СтавкаНДС;

   Попытка

       СпрОбъект.Записать();

   Исключение

       Сообщить (ОписаниеОшибки());

   КонецПопытки

КонецЦИкла;

КонецЦИкла;

   SuperMario

15 — 03.09.09 — 09:47

(13) учись правильно писать условия в запросе

   Mitriy

16 — 03.09.09 — 09:47

|ГДЕ
              |    Материалы.Ссылка В (&группа)
              |    И Материалы.ЭтоГруппа = ЛОЖЬ»;

   Mitriy

17 — 03.09.09 — 09:48

(16)* пардон, иерархию забыл написать…

   Parti

18 — 03.09.09 — 09:52

(14){Обработка.ОбработкаСправочников.Форма.Форма(66)}: Поле объекта не обнаружено (Ссылка)

Запрос.УстановитьПараметр(«Группа»,СтрГруппа.Ссылка);

   SuperMario

19 — 03.09.09 — 09:58

(18) какого типа у тебя СтрГруппа ?

   zyto

20 — 03.09.09 — 09:58

(18)Что у тебя СписокГрупп?

   nv24

21 — 03.09.09 — 10:00

(16) а разве нельзя условие так прописать

|ГДЕ

              |    Материалы.Родитель =&группа

              |    И Материалы.ЭтоГруппа = ЛОЖЬ»;

   zyto

22 — 03.09.09 — 10:02

(21)Нельзя.

Кстати, не совсем понятно что автор хотел получить своим запросом…

   SuperMario

23 — 03.09.09 — 10:09

(22) похоже на то, что из некоего «СписокГрупп» идет выборка групп справочника материалов и потом элементам родителя этих групп впихивается ставка НДС.

Вот только автор со понятием ссылок не знаком и он не ответил на (20)

   Parti

24 — 03.09.09 — 10:10

(20) СПисокГрупп это табличная часть обработки. Вот код кнопки «Выполнить»:

Процедура КнопкаВыполнитьНажатие(Кнопка)

   // Вставить содержимое обработчика.

   Запрос = Новый Запрос();

   Запрос.Текст = «ВЫБРАТЬ

   |    Материалы.Ссылка КАК Материал

   |ИЗ

   |    Справочник.Материалы КАК Материалы

   |ГДЕ

   |    Материалы.ЭтоГруппа = ИСТИНА

   |УПОРЯДОЧИТЬ ПО

   |    Наименование

   |АВТОУПОРЯДОЧИВАНИЕ»;

   
   РезультатЗапроса=Запрос.Выполнить();

   Выборка = РезультатЗапроса.Выбрать();

    СписокГрупп.Очистить();

   Пока Выборка.Следующий() Цикл

       НоваяСтрока = СписокГрупп.Добавить();

       НоваяСТрока.Наименование = Выборка.МАтериал;

       КОнецЦикла;

       

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

   SuperMario

25 — 03.09.09 — 10:12

Запрос.УстановитьПараметр(«Группа»,СтрГруппа.Ссылка);

на

Запрос.УстановитьПараметр(«Группа»,СтрГруппа.Материал);

   ASU_Diamond

26 — 03.09.09 — 10:14

если у тебя в ТЧ список элементов, то на кой запрос???

   Parti

27 — 03.09.09 — 10:15

(26) в ТЧ список Групп элементов справочника. (ГДЕ

   |    Материалы.ЭтоГруппа = ИСТИНА)

   ASU_Diamond

28 — 03.09.09 — 10:18

Запрос.Текст = «ВЫБРАТЬ
              |    Материалы.Ссылка КАК Материал
              |ИЗ
              |    Справочник.Материалы КАК Материалы
              |ГДЕ
              |    Материалы.Наименование = &группа
              |    И Материалы.ЭтоГруппа = ЛОЖЬ»;
Ты в запросе указываешь что найти элементы с наименованием таким же как у группы, но чтобы это была не группа?

   Parti

29 — 03.09.09 — 10:19

(25) теперь робит. Спс, оставлю твой вариант

   Parti

30 — 03.09.09 — 10:19

(28) да, виноват

   ASU_Diamond

31 — 03.09.09 — 10:20

(30) следующий раз задавая вопрос описывай всю ситуацию, пиши что ты хочешь сделать

   nv24

32 — 03.09.09 — 10:21

(27)примерно так

//—получим все группы в справочнике

   Запрос1= Новый Запрос;

   Запрос1.Текст =

   «ВЫБРАТЬ

   |    Номенклатура.Ссылка  КАК Номенклатура

   |ИЗ

   |    Справочник.Номенклатура КАК Номенклатура

   |ГДЕ

   |    Номенклатура.ЭтоГруппа = ИСТИНА»;

   ТЗГрупп=Запрос1.Выполнить().Выгрузить();

   
   
   Запрос = Новый Запрос;

   Запрос.Текст =

   «ВЫБРАТЬ

   |    Номенклатура.Ссылка КАК Номенклатура

   |ИЗ

   |    Справочник.Номенклатура КАК Номенклатура

   |ГДЕ

   |    Номенклатура.ЭтоГруппа = ЛОЖЬ

   |    И Номенклатура.Родитель = &Родитель»;

   Для каждого СтрГруппа ИЗ ТЗГруппН Цикл

       Запрос.УстановитьПараметр(«Родитель»,СтрГруппа.Номенклатура);  

       Сообщить(«Группа:»+СтрГруппа.Номенклатура);

       РезультатЗапроса=Запрос.Выполнить();

       Выборка = РезультатЗапроса.Выбрать();

       сч=0;

       Пока Выборка.Следующий() Цикл

           сч=сч+1;

           СпрОбъект = Выборка.Номенклатура.ПолучитьОбъект();

           Сообщить(»     — Товар=»+СпрОбъект.Наименование+» Ставка НДС=»+СпрОбъект.СтавкаНДС);

           СпрОбъект.СтавкаНДС = СтрГруппа.СтавкаНДС;

           Попытка

               СпрОбъект.Записать();

           Исключение

               Сообщить (ОписаниеОшибки());

           КонецПопытки

       КонецЦИкла;

   КонецЦИкла;

только в номенклатуру на материалы поменять надо

   Parti

33 — 03.09.09 — 10:24

спс!

   takefive

34 — 03.09.09 — 10:31

Можно так…

|ГДЕ

|(НЕ Номенклатура.ЭтоГруппа)

   zyto

35 — 03.09.09 — 10:32

«Номенклатура.Родитель = &Родитель» — абсолютно неверное условие если в справочнике больше 2х уровней.

   nv24

36 — 03.09.09 — 10:45

(35)а бывает элемент  у которого больше одного родителя?

   Sammo

37 — 03.09.09 — 10:51

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

  

nv24

38 — 03.09.09 — 10:56

(35)и(37) не путайте тёплое с мягким — родителя и вложенность групп.

Назначение справочников

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

Система 1С:Предприятие 8 позволяет вести практически неограниченное количество необходимых справочников. Каждый справочник представляет собой список однородных объектов: должностей, сотрудников, клиентов, товаров и т. д. Каждый такой объект называется элементом справочника.

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

Реквизиты справочника (поля)

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

Помимо Кода и Наименования, в справочниках системы 1С:Предприятие может храниться любая дополнительная информация об элементе справочника. Для хранения такой информации в справочнике могут быть созданы  дополнительные реквизиты (поля). Используя механизм реквизитов справочника, легко организовать, например, картотеку сотрудников. Например, справочник Сотрудники почти наверняка будет иметь реквизиты Должность, Оклад, ДатаПриема и другие. Фирма 1С предвосхитила программистов и ввела во все справочники два обязательных (предопределенных) реквизита: Код и Наименование. Действительно, практически любой объект из реальной жизни содержит эти атрибуты. Например, для сотрудников кодом выступает табельный номер, а наименованием — Фамилия, Имя и Отчество (ФИО). Кроме того, использование кодов (при использовании автоматической нумерации) позволяет с легкостью понять, какой элемент был введен раньше, а какой позже в базу данных.

Типы данных

Для каждого реквизита справочника необходимо задать тип данных, например, «число», «строка», «дата», булево (Истина или Ложь). Это базовые типы, но можно указать и сложные типы данных. Например, реквизит Должность имеет тип данных Должности. В этом случае, значения этого реквизита будут выбираться из справочника Должности. Так реализуется простейшая связь между справочниками, когда значения реквизитов одного справочника выбираются из элементов другого справочника.

Иерархические справочники

Список элементов справочника в системе 1С:Предприятие 8 может быть многоуровневым. В этом случае все строки справочника будут разделяться на 2 вида: «просто» элементы справочника и группы справочника. Группы позволяют переходить на нижележащие уровни многоуровневого справочника. Использование многоуровневых справочников позволяет организовать ввод информации в справочник с нужной степенью детализации. Элементы и группы элементов в многоуровневом справочнике можно переносить из одной группы в другую.

Подчиненные справочники

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

Табличные части

Начиная с версии 1С 8.0, в платформе реализована возможность для элемента справочника задавать одну или несколько табличных частей. Эту возможность рекомендуется использовать для отражения информации, связанной с данным элементом, но не имеющей собственной объектной сущности (для которых рекомендуется заводить подчиненные справочники). Например, для справочника Сотрудники могут быть заведены табличные части Образование и СоставСемьи. Работа с табличными частями похожа на работу с подчиненными справочниками за исключением того, что табличные части не могут использоваться в качестве значений реквизитов других объектов.

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

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

1. Ссылка на справочник

Для работы со справочником из какого-либо модуля требуется сначала создать ссылку на этот справочник.

СпрСотрудники = Справочники.Сотрудники; // или 2 вариант
СпрДолжности = Справочники[«Должности»];

2. Создание и запись нового элемента справочника

НовЭл Справочники.Сотрудники.СоздатьЭлемент();
НовЭл.Наименование = «Петров Петр Петрович»;
НовЭл.Оклад = 25000;
НовЭл.Записать(); // именно в этот момент происходит запись в базу данных

3. Создание и запись новой группы справочника (для иерархического справочника)

Нов = Справочники.Сотрудники.СоздатьГруппу();
Нов.Наименование = «Работающие»;
Нов.Записать();  
// или 2 вариант 
Нов = Справочники[«Сотрудники»].СоздатьГруппу();
Нов.Наименование = «Работающие»;
Нов.Записать();

4. Поиск элемента справочника

// если элемент найден, то он возвращается, иначе возвращается значение Неопределено

СпрСотр Справочники.Сотрудники;

НайденныйСотр = СпрСотр.НайтиПоКоду(123);   //ищем по коду
НайденныйСотр = СпрСотр.НайтиПоНаименованию(«Иванов Иван Иванович»); //по наименованию
НайденныйСотр СпрСотр.НайтиПоРеквизиту(«Оклад», 5000);    //по реквизиту

//далее нужно проверить найденное значение

Если НайденныйСотр = Неопределено Тогда
    //элемент не найден
КонецЕсли;

5. Удаление элемента справочника

СпрСотр Справочники.Сотрудники;

СпрСотр.Удалить(); //непосредственное удаление текущего элемента справочника

СпрСотр.УстановитьПометкуУдаления (Истина); //пометка на удаление
СпрСотр.УстановитьПометкуУдаления (Ложь); //снять пометку на удаление

//можно проверить, помечен ли элемент на удаление
//свойство ПометкаУдаления имеет тип Булево (Истина или Ложь)

Пометка = СпрСотр.ПометкаУдаления; //обратите внимание: это свойство
Если Пометка = Истина Тогда
    //элемент помечен на удаление
КонецЕсли;

6. Перебор элементов справочника

Выборка = Справочники.Сотрудники.Выбрать();
Пока Выборка.Следующий() = 1 Цикл // начало перебора элементов справочника в цикле
//действия с очередным элементом …
Сообщить(«Сотрудник » + Выборка.Наименование);
КонецЦикла;

7. Родитель. Перебор элементов внутри группы.

Группа в терминах 1С — это «родитель».

СпрСотр Справочники.Сотрудники;
ГруппаРаботающие = СпрСотр.НайтиПоНаименованию(«Работающие»);
Выборка = СпрСотр.Выбрать(ГруппаРаботающие);
Пока Выборка.Следующий() = Цикл
   //действия с очередным элементом
   Сообщить(«Сотрудник » Выборка.Наименование);
КонецЦикла;

8. Владелец. Перебор элементов справочника, принадлежащих элементу другого справочника.

Один справочник подчинен другому справочнику, например справочник НалоговыеЛьготы подчинен справочнику Сотрудники.

Выборка = Справочники.НалоговыеЛьготы.Выбрать( ,Сотрудник); //тут сотрудник — ссылка на элемент справочника сотрудники
Пока Выборка.Следующий() = Цикл
   //действия с очередным элементом
   Сообщить(«льгота « + Выборка.Наименование);
КонецЦикла;


9. Транзакция

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

СпрСотр Справочники.Сотрудники;
НачатьТранзакцию();

Для Ном = 1 По 100 Цикл
   Нов = СпрСотр.СоздатьЭлемент();
   Нов.Наименование = «Новый » + Строка(Ном);
   Нов.Записать();
КонецЦикла;

ЗафиксироватьТранзакцию();

Содержание

Справочники

Описание

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

Структура справочника

Справочник обычно описываются следующим набором данных:

  • Пользовательские реквизиты — при проектировании пользователь определяет какие данные, какого типа будут храниться в справочнике. Например у справочника Банковские счета будут определены реквизиты: номер счета, банк и тд, для справочника контрагенты ИНН, КПП и тд.

  • Предопределенные реквизиты — любой справочник обладает набором предопределенных реквизитов.

  • Табличные части — справочник может любое количество табличных частей.

Предопределенные реквизиты

У каждого справочника есть номер и наименование. В принципе их можно отключить, указав длину 0. Так же код может быть числовым или текстовым, если код текстовый для удобства сортировки система дополняет код лидирующими нулями на всю длину кода, например если у справочника указана длина кода 9 и справочнику был присвоен код 3 то система дополнит нулями до такого вида: «000000003». Также в случае если имеется распределенная база в код обычно добавляется префикс той базы в которой был создан элемент, например: «ЦН0000003». Нужно учитывать эту особенность если вы соберетесь указывать числовой код, этот объект не сможет корректно работать в распределенной базе. У справочника есть и другие предопределенные реквизиты:

  • ЭтоГруппа – Имеет смысл только для иерархических справочников. Указывает на то что элемент является группой.

  • Родитель — Имеет смысл только для иерархических справочников. Указывает на группу или элемент который является родителем для этого справочника.

  • Владелец – Имеет смысл только для подчиненных справочников. Указывает на владельца данного справочника.

  • ПометкаУдаления – атрибут с типом булево, указывает помечен ли элемент на удаление или нет.

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

  • Предопределенный – атрибут с типом булево указывает на то, что элемент создан в конфигураторе.

Иерархичность.

Иерархия это способность выводить справочник в виде дерева. Эта возможность бывает очень удобной, в случаях когда в справочнике содержится много информации. В таких случаях бывает полезно разложить номенклатуру «по полочкам». При включении иерархичности у справочника, добавляются два стандартных реквизита ЭтоГруппа и Родитель. Манипулируя значением реквизита Родитель, можно переназначать родителей элемента. Строится иерархия на группах, в эти группы могут входить другие элементы или другие группы. Аналогию можно провести с проводником windows или с большинством файловых систем если вам будет удобно: есть папки в которых могут быть как файлы так и папки в которых в свою очередь тоже могут быть и файлы и папки итд. Иерархия может работать и без групп. То есть родителями могут выступать другие элементы справочника. Такой вид иерархии называется иерархия элементов. Если мы настроили иерархию, у нас появляется возможность настраивать, для какого типа могут использоваться реквизиты, для групп, элементов, или и для того и для другого. Иерархия настраивается на закладке Иерархия свойств справочника.

Подчиненность

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

Ввод по Строке

При выборе ссылочных данных в 1С есть возможность выбрать элемент справочника или документ, набирая ключевые реквизиты объекта который мы хотим найти, выглядит это следующим образом: пользователь, набирает «масло моторное» в поле ввода с типом «Справочник.Номенклатура» и нажимает ввод. 1С находит все записи которые начинаются с названия со слов «масло моторное» и показывает их в виде выпадающего списка под полем где пользователь вводил текст. Такой же ввод возможен и для документов. Это поведение системы можно настроить на закладке «Формы». Там есть поле Ввод по строке, по умолчанию для справочников указана возможность поиска по коду и наименованию, но туда можно добавить и свои реквизиты, для того, что бы добавить этот реквизит, он должен быть индексирован и реквизит должен быть примитивного типа.

Предопределенные элементы справочников.

Предопределенные элементы справочников определяются в конфигураторе на закладке Прочие. При создании элемента указывается имя и наименование предопределенного элемента. Имя и будет являться идентификатором для обращения к этому предопределенному элементу, поэтому к имени предъявляются такие же требования как и к другим идентификаторам(не может начинаться с числа, нельзя использовать пробелы и тд). Наименование может быть любым, его пользователь и увидит в справочнике и сможет его при желании изменить. Пользователь не может изменить имя который был указано при создании этого элемента, зато он может удалить предопределенный элемент.FIXME(надо бы найти номер релиза когда это стало возможным).
Обращение к предопределенным элементам происходит так:

НашаФирма = Справочники.Контрагенты.НашаДочерняяФирма

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

Важно. Контроль за удалением предопределенных элементов лежит на плечах разработчиков, а не платформы.

Для предопределенных элементов справочников, стандартный реквизит Предопределенный имеет значение Истина. Это свойство которое доступно только на чтение, но это не означает, что нельзя «обычный» элемент справочника сделать предопределенным и наоборот. В последних релизах 8.3FIXME(Надо узнать в каких именно), появилась возможность переопределять предопределенные элементы изменяя свойство ИмяПредопределенныхДанных. Например, вот так можно сделать элемент не предопределенным:

ПредОпрЭлемент = Справочники.МойСправочник.НайтиПоКоду("КодЭлемента").ПолучитьОбъект();
ПредОпрЭлемент.ИмяПредопределенныхДанных = “”;
ПредОпрЭлемент.Записать();

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

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

Нашафирма = Справочники.Организации.НайтиПоНаименованию("ООО Рога и копыта")

или что еще хуже

Нашафирма = Справочники.Организации.НайтиКоду("000112")

Можно просто указать:

Нашафирма = Справочники.Настройки.НашаФирма.Значение

подробнее можно почитать здесь http://infostart.ru/public/275145/

Классы для работы со справочниками.

Все классы справочника можно увидеть в ветке Прикладные объекты –> Справочники.

Cправочники это элементы которые хранятся в базе данных, считается очевидным, что обращение к любому из классов возможно только на сервере.

Справочник менеджер

Справочник менеджер – можно получить с помощью переменных глобального контекста:

Номенклатура = Справочники.Номенклатура;

Этот класс служит для:

  • Поиска по наименованию, коду или другому реквизиту.

    Ножницы = Справочники.Номенклатура.НайтиПоНаименованию("Ножницы канцелярские");
  • Программного создания групп или элементов:

    НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
    НовыйЭлемент.Реквизит1 = "КакоеТоЗначение";
    НовыйЭлемент.Записать();
  • Делать выборки:

    Выборка = Справочники.Номенклатура.Выбрать()

    Получать пустые ссылки:

    Пусто = Справочники.Номенклатура.ПустаяСсылка(); 

И много еще разных возможностей которые можно наблюдать в синтаксис помощнике в ветке: Прикладные объекты – >Справочники – СправочникМенеджер.<ИмяСправочника>

Справочник ссылка

Справочник ссылка – самый часто используемый тип. Используется для чтения данных справочника. Его можно получить с помощью НайтиПоНаименованию, НайтиПоКоду и др методов класса СправочникМенеджер. Так же его можно получить с помощь класса Выборка и этот тип данных хранится в реквизите Cсылка объекта класса Справочник объект.
В этом классе нам доступны все реквизиты справочника, табличные части и все стандартные реквизиты. Абсолютно все свойства этого класса нам доступны только на чтение. Для того что бы изменять реквизиты справочника нам нужен класс Справочник Объект. Получить его можно с помощью метода Получить Объект().

Справочник Объект

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

Справочник Выборка

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

Популярные приемы работы со справочниками

Поиск по наименованию.

Несмотря на то, что неоднократно рассматривается поиск элемента справочника по наименованию, «зашивать» в код значения из базы данных считается дурным тоном.

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

Поиск по коду

Для поиска по коду используется функция НайтиПоКоду(). Для использования этого метода необходимо в параметре «Код» указать код, по которому будет производиться поиск. Если в качестве кода указывается полный путь с учетом иерархии (уровни справочника разделяются символом «/»), то второй параметр поиск по полному коду, необходимо установить в Истина. Например:
Номенклатура «Слонопотам» с кодом «001142» находится в папке «Мягкие Игрушки» с кодом «000826» которая находится в папке «Игрушки» с кодом 000375. Тогда можно найти ее с помощью вот такой строки

Слонопотам = Справочники.Номенклатура.НайтиПоКоду("000375/000826/001142", Истина);

Или можно искать сразу:

Слонопотам = Справочники.Номенклатура.НайтиПоКоду("001142");

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

Выборка

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

Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл 
	Наименование = Выборка.Наименование;
КонецЦикла;

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

Программное создание элементов справочника

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

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемнт();
НовыйЭлемент.Наименование = "ТестоваяНоменклатура";
НовыйЭлемент.ПолноеНаименование = "ТестоваяНоменклатура";
//Заполнение всех остальных элементов
НовыйЭлемент.Записать();

Группа справочника создается аналогично с помощью метода СоздатьГруппу()
В том случае, если у справочника установлено свойство Автонумерация код указывать не нужно, он устанавливается автоматически.

Проверка переменной с типом СправочникСсылка на заполненность

Иногда возникает необходимость проверить заполнено ли значение с типом «Справочник.Ссылка». Такая необходимость может возникнуть, когда реквизит какого либо объекта имеет тип «Справочник.Ссылка» или когда вы например ищете элемент справочника по коду или наименованию, или в ряде других случаев, когда метод возвращает пустую ссылку на справочник. Есть несколько способов это сделать:

  1. Использовать метод глобального контекста ЗначениеЗаполнено() который можно применить к любому типу а не только к справочнику. Доступно и на клиенте и на сервере.

  2. Сравнить c пустой ссылкой менеджера этого справочника. Например:

    Если ПроверяемоеЗначение = Справочники.Номенклатура.ПустаяСсылка() Тогда

    Только для сервера

  3. Использовать метод ‘Пустая()’ доступный на клиенте для объектов класса «Справочник ссылка».

Проверка элемента справочника на вхождение в какую либо группу или подчинение элементу

Когда мы говорим о проверке подчиненности, необходимо понимать, что все методы справедливы не только для групп, но и для элементов, если у справочника установлен вид иерархии «Иерархия элементов».
Здесь возможно несколько вариантов: если у нас есть группа и нам необходимо знать если ли именно в ней и нигде иначе определенный элемент справочника, то можно сравнить предопределенный реквизит Родитель нужного нам элемента справочника с ссылкой на группу, например:

Если КакойтоЭлемент.Родитель = НужнаяГруппа Тогда

Если справочник многоуровневый и нужно знать есть ли элемент в этой группе или где то в подчинненых группах то можно воспользоваться методом «ПринадлежитЭлементу()» этот метод вернет Истина если элемент содержится в текущей или любой подчиненной группе. Например в этом случае

НужнаяГруппа = НайтиПоНаименованию("ГруппаРаз");
Если НашЭлемент.ПринадлежитЭлементу(НужнаяГруппа) Тогда

условие будет истинным.

СправочникСсылка <> СправочникОбъект

При работе со справочниками очень важно понимать, что во всех реквизитах, выборках и тд, мы чаще всего работаем с типом СправочникСсылка и этот тип позволяет получить любую информацию которая находится в его реквизитах, но не поддерживает запись. Для изменения реквизитов справочника и записи следует использовать тип СправочникОбъект. Преобразовать ссылку в объект можно с помощью метода ПолучитьОбъект() Например:

КонтрагентПетров = Справочники.Контрагенты.НайтиПоНаименованию("Петров Иван Сергеевич");
КонтрагентОбъект = КонтрагентПетров.ПолучитьОбъект();
//Здесь идут какие то изменения
КонтрагентОбъект.Записать(); //и непосредственно запись

Проверка на то что ссылка является ссылкой на справочник

Проверить то что справочник является ссылкой можно очень просто, с помощью одной строки:

Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(СсылкаНаЭлементСправочника));

Где СсылкаНаЭлементСправочника проверяемая ссылка, эта строка вернет Истина если проверяемая ссылка является ссылкой на какой либо элемент справочника.

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

Понравилась статья? Поделить с друзьями:
  • Вспомогательные процессы транспортной компании
  • Втб аккредитация страховых компаний по ипотеке
  • Время работы нотариальной конторы на бассейной
  • Время работы нотариальной конторы на блюхера 6
  • Время работы обменников в лиде на тухачевского