Функция проверки необходимости перерасчета и Перерасчет записей Код 1C v 8.х // Проверяет необходимость выполнения перерасчета документа.
Функция НеобходимостьПерерасчета(Регистратор) Экспорт
Запрос = Новый Запрос( "ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо
|ИЗ
| (ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо КАК ФизЛицо
| ИЗ
| РегистрРасчета.ОсновныеНачисленияРегл.ПерерасчетОсновныхНачислений
| КАК Перерасчет
| ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо
| ИЗ
|РегистрРасчета.ДополнительныеНачисленияРегл.ПерерасчетДополнительныхНачислений
| КАК Перерасчет
| ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор) КАК Перерасчет");
Запрос.УстановитьПараметр("Регистратор", Регистратор); Если Запрос.Выполнить().Пустой() Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции // НеобходимостьПерерасчета
Данная функция возвращает значение Истина, если хотя бы в одной из таблиц перерасчета есть хотя бы одна запись по данному документу. Если таких записей нет, то функция вернет значение Ложь, и перерассчитывать записи этого документа не нужно.
Собственно перерасчет записей, как и их расчет, рекомендуется выполнять в процедуре общего модуля по тем же причинам, что и расчет. Процедура перерасчета отличается от процедуры расчета только тем, что в расчете участвуют не все записи документа, а только удовлетворяющие усло- виям проводимого перерасчета. Например, только записи по конкретным сотрудникам и конкретным видам расчета.
Наконец, после того как нужные записи перерассчитаны, необхо- димо средствами встроенного языка удалить соответствующие записи из таблицы перерасчета, так как перерасчет больше не требуется.
Процедуру перерасчета записей документа рекомендуется помещать в модуле этого документа как экспортную процедуру. В этом случае она может быть вызвана из других модулей, в том числе из обработки перерасчета, описанной в предыдущем разделе. В качестве параметров в процедуру должна передаваться информация о том, какие именно записи документа необходимо перерассчитать. Ниже приведен пример такой процедуры, где в качестве параметра используется список сотрудников, по которым необходимо выполнить перерасчет.
Процедура перерасчета записей документа
Код 1C v 8.х Процедура Перерассчитать(Физлица = Неопределено) Экспорт
// Перерасчет выполняется в транзакции. НачатьТранзакцию();
Если Не Расчеты.НеобходимостьПерерасчета(Ссылка) Тогда
Возврат; КонецЕсли;
// Считать движения документа по регистрам расчета. Движения.ОсновныеНачисленияРегл.Прочитать(); Движения.ДополнительныеНачисленияРегл.Прочитать();
// Перерасчет и перезапись движений по регистрам расчета.
Расчеты. ПерерассчитатьЗаписиРегистраРасчета("ОсновныеНачисленияРегл", Движения.ОсновныеНачисленияРегл, ОсновныеНачисления, Физлица);
Движения.ОсновныеНачисленияРегл.Записать(Истина, Истина);
Расчеты.ПерерассчитатьЗаписиРегистраРасчета("ДополнительныеНачисленияРегл", Движения.ДополнительныеНачисленияРегл, ДополнительныеНачисления, Физлица);
Движения.ДополнительныеНачисленияРегл.Записать(Истина, Истина);
// Записать измененные данные табличных частей документа. Записать();
// Удалить записи перерасчета, по которым выполнен перерасчет. Для Н = 1 По 2 Цикл
Если Н = 1 Тогда
НаборЗаписей = РегистрыРасчета.ОсновныеНачисленияРегл.
Перерасчеты.ПерерасчетОсновныхНачислений. СоздатьНаборЗаписей();
НаборЗаписей.Записать(); КонецЦикла;
// Перерасчет выполняется в транзакции. ЗафиксироватьТранзакцию();
КонецПроцедуры
Процедуры общего модуля, выполняющие непосредственный перерасчет записей, по алгоритму схожи с процедурами расчета. Основное отличие состоит в том, что в процедурах перерасчета происходит расчет только тех записей, которые удовлетворяют заданным условиям. В данном случае это записи по заданному списку сотрудников. Также при перерасчете не нужно производить предварительную запись набора с формированием фактического периода действия, так как набор уже записан в регистр (перерассчитываемый документ всегда проведен). Ниже приведен пример процедур
ПерерассчитатьЗаписиРегистраРасчета() и ПерерассчитатьНаборЗаписей() . Эти процедуры используют вызов тех же самых процедур и функций, которые используются при расчете.
Процедуры перерасчета записей
Код 1C v 8.х Процедура ПерерассчитатьНаборЗаписей(НаборЗаписей, Приоритет, ТабличнаяЧасть = Неопределено, ФизЛица = Неопределено)
Для каждого Запись из НаборЗаписей Цикл
Если Запись.ВидРасчета.Приоритет = Приоритет Тогда
Если НЕ ФизЛица.НайтиПоЗначению(Запись.Физлицо) = Неопределено Тогда
// Получить данные для расчета записи.
ДанныеДляРасчета = ПолучитьДанныеДляРасчета(Запись);
Иначе
НаборЗаписей = РегистрыРасчета.ДополнительныеНачисленияРегл.
Перерасчеты.ПерерасчетДополнительныхНачислений. СоздатьНаборЗаписей();
// Вызвать процедуру расчета записи. РассчитатьЗапись(Запись, ДанныеДляРасчета);
КонецЕсли;
НаборЗаписей.Отбор.ОбъектПерерасчета.Значение = Ссылка; Если Физлица <> НеОпределено Тогда
НаборЗаписей.Прочитать(); СтрокиКУдалению = Новый Массив;
Для Каждого СтрокаПерерасчета из НаборЗаписей Цикл
Если Физлица.НайтиПоЗначению( СтрокаПерерасчета.Физлицо) <> НеОпределено Тогда СтрокиКУдалению.Добавить(СтрокаПерерасчета);
КонецЕсли; КонецЦикла;
Для Каждого Строка Из СтрокиКУдалению Цикл
НаборЗаписей.Удалить(Строка); КонецЦикла;
КонецЕсли;
// Вернуть результат расчета в табличную часть документа. Если Не ТабличнаяЧасть = Неопределено Тогда
СтрокаТабличнойЧасти = ТабличнаяЧасть.Получить(Запись.НомерСтроки-1);
СтрокаТабличнойЧасти.Результат = Запись.Результат; КонецЕсли;
КонецЕсли; КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПерерассчитатьЗаписиРегистраРасчета(ИмяРегистра,
НаборЗаписей, ТабличнаяЧасть = Неопределено, Физлица = Неопределено) Экспорт
Регистратор = НаборЗаписей.Отбор.Регистратор.Значение;
// Запрос по приоритетам видов расчета
// только записей заданных сотрудников.
Запрос = Новый Запрос; Запрос.Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| " + ИмяРегистра + ".ВидРасчета.Приоритет КАК Приоритет
|ИЗ
| РегистрРасчета." + ИмяРегистра + " КАК " + ИмяРегистра + "
|ГДЕ
| ФизЛицо В (&СписокФизлиц) И Регистратор = &Регистратор
|УПОРЯДОЧИТЬ ПО
| Приоритет
|ИТОГИ ПО
| " + ИмяРегистра + ".ВидРасчета.Приоритет";
Запрос.УстановитьПараметр("СписокФизлиц", Физлица); Запрос.УстановитьПараметр("Регистратор", Регистратор);
ВыборкаПриоритетов = Запрос.Выполнить().
Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
// Для каждого значения приоритета выполняется расчет записей. Пока ВыборкаПриоритетов.Следующий() Цикл
ПерерассчитатьНаборЗаписей(НаборЗаписей, ВыборкаПриоритетов.Приоритет, ТабличнаяЧасть, Физлица);
// Записать набор в регистр для расчета записей следующего
// приоритета, фактический период действия не пересчитывается. НаборЗаписей.Записать(Истина, Истина);
КонецЦикла;
КонецПроцедуры
Категория:
Регистры расчета Поиск в базе битых ссылок - "объект не найден" В статье
Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID мы обсуждали как востановить битые ссылки!
А вот как найти в базе все битые ссылки, которые имеют вид типа "<Объект не найден> (137:8b270030482898d011daad3cc45fc830)"?
Для поиска этого была написана данная обработка:
Скачивать файлы может только зарегистрированный пользователь!
Для поиска: Выбираем объекты метаданных , которые хотим проверить, жмем кнопочку "Выполнить" и наблюдаем в таблице выходные данные. Откуда можем попасть в объекты-источники.
Для программиста:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
ИспользоватьОграничение = ЗначениеЗаполнено(ОграничениеТипов);
РезультатПоиска.Очистить();
Для Каждого ОбъектыМетаданных Из КоллекцияОбъектов Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние(ОбъектМетаданных.ПолноеИмя());
ПроверитьОбъектНаБитыеСсылки(ОбъектМетаданных);
КонецЦикла;
КонецЦикла;
Для Каждого ОбъектыМетаданных Из КоллекцияРегистров Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние(ОбъектМетаданных.ПолноеИмя());
ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных);
КонецЦикла;
КонецЦикла;
//Анализ последовательностей
//ПроверитьОбъектНаБитыеСсылки(Метаданные.Справочники.СотрудникиОрганизаций);
КонецПроцедуры
Процедура ВывестиДанные(ТекстЗапроса)
Запрос = Новый Запрос(ТекстЗапроса);
Попытка
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ТЗ = РезультатЗапроса.Выгрузить();
Для Каждого Стр Из ТЗ Цикл
ОбработкаПрерыванияПользователя();
Строка = РезультатПоиска.Добавить();
ЗаполнитьЗначенияСвойств(Строка, Стр);
КонецЦикла;
КонецЕсли;
Исключение
Сообщить(ИнформацияОбОшибке().Описание + " " + ИнформацияОбОшибке().Причина);
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных.ПолноеИмя();
Если Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда
Если ОбъектМетаданных.РежимЗаписи = НезависимыйРежимЗаписи Тогда
//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Измерения, ИмяТаблицы);
//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Ресурсы, ИмяТаблицы);
//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
Возврат;
КонецЕсли;
АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
КонецЕсли;
АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Измерения, ИмяТаблицы);
АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
АнализРегистратораРегистра(ОбъектМетаданных, ИмяТаблицы);
Если Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда
//Для рег. бухгалтерии анализ субконто
КонецЕсли;
Если Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда
//Для регистров расчета доп. анализ
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьОбъектНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных.ПолноеИмя();
АнализСвойствОбъекта(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
Для Каждого ТабЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл
Если ТабличныеЧастиИсключения.Найти(ТабЧасть.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
АнализСвойствОбъекта(ОбъектМетаданных, ТабЧасть.Реквизиты, ИмяТаблицы + "." + ТабЧасть.Имя)
КонецЦикла;
//проверка владельца у справочников
Если Метаданные.Справочники.Содержит(ОбъектМетаданных) И ОбъектМетаданных.Владельцы.Количество() > 0 Тогда
МассивВладельцев = Новый Массив;
Для Каждого Элемент Из ОбъектМетаданных.Владельцы Цикл
МассивВладельцев.Добавить(Элемент);
КонецЦикла;
//АнализСвойствВладельцаОбъекта(ОбъектМетаданных, МассивВладельцев, ИмяТаблицы);
КонецЕсли;
//Для задач поле исполнитель
//проверки в журналах
ОбработкаПрерыванияПользователя();
КонецПроцедуры
Процедура АнализСвойствОбъекта(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения.Найти(Реквизит.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Для Каждого моТип Из Реквизит.Тип.Типы() Цикл
ТекстЗапроса = "";
МетаданныеТипа = Метаданные.НайтиПоТипу(моТип);
Если МетаданныеТипа <> Неопределено
И Не Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу(МетаданныеТипа.ПолноеИмя()) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ДобавитьВЗапросОбъект(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит.Имя, моТип);
КонецЕсли;
Если Не ПустаяСтрока(ТекстЗапроса) Тогда
ВывестиДанные(ТекстЗапроса);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура АнализСвойствРегистра(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения.Найти(Реквизит.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Для Каждого моТип Из Реквизит.Тип.Типы() Цикл
ТекстЗапроса = "";
МетаданныеТипа = Метаданные.НайтиПоТипу(моТип);
Если МетаданныеТипа <> Неопределено
И Не Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу(МетаданныеТипа.ПолноеИмя()) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит.Имя, моТип);
КонецЕсли;
Если Не ПустаяСтрока(ТекстЗапроса) Тогда
ВывестиДанные(ТекстЗапроса);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура АнализРегистратораРегистра(ОбъектМетаданных, ИмяТаблицы)
МассивРегистраторов = ПолучитьСписокРегистраторов(ОбъектМетаданных);
Для Каждого Регистратор Из МассивРегистраторов Цикл
Если РеквизитыИсключения.Найти("Регистратор") <> Неопределено Тогда
Продолжить;
КонецЕсли;
моТип = Регистратор;
ТекстЗапроса = "";
МетаданныеТипа = Метаданные.НайтиПоТипу(моТип);
Если МетаданныеТипа <> Неопределено
И Не Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу(МетаданныеТипа.ПолноеИмя()) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, "Регистратор", моТип);
КонецЕсли;
Если Не ПустаяСтрока(ТекстЗапроса) Тогда
ВывестиДанные(ТекстЗапроса);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьСписокРегистраторов(ОбъектМетаданных)
МассивРегистраторов = Новый Массив;
МенеджерОбъект = ПолучитьМенеджерОбъекта(ОбъектМетаданных);
Если МенеджерОбъект <> Неопределено Тогда
НаборЗаписей = МенеджерОбъект.СоздатьНаборЗаписей();
ЭлементОтбора = НаборЗаписей.Отбор.Регистратор;
МассивРегистраторов = ЭлементОтбора.ТипЗначения.Типы();
КонецЕсли;
Возврат МассивРегистраторов;
КонецФункции
Функция ПолучитьМенеджерОбъекта(ОбъектМетаданных)
Перем МенеджерОбъекта;
Если Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыБухгалтерии[ОбъектМетаданных.Имя];
ИначеЕсли Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыНакопления[ОбъектМетаданных.Имя];
ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыСведений[ОбъектМетаданных.Имя];
ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыРасчета[ОбъектМетаданных.Имя];
КонецЕсли;
Возврат МенеджерОбъекта;
КонецФункции
Функция ПоискПоТипу(ИмяТипа)
Результат = Ложь;
Если ИспользоватьОграничение Тогда
МассивСтрок = ОграничениеТипов.НайтиСтроки(Новый Структура("ТипДанных", ИмяТипа));
Если ЗначениеЗаполнено(МассивСтрок) Тогда
Результат = Истина;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| """ + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Регистратор КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия(ИмяРеквизита, ТипРеквизита);
ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), "", Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + Текст;
КонецПроцедуры
Процедура ДобавитьВЗапросОбъект(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| """ + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Ссылка КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия(ИмяРеквизита, ТипРеквизита);
ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), "", Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + Текст;
КонецПроцедуры
Функция ДобавитьУсловия(ИмяРеквизита, ТипРеквизита)
мдОбъекта = Метаданные.НайтиПоТипу(ТипРеквизита);
ИмяТаблицы = мдОбъекта.ПолноеИмя();
ПроверкаНаПустыеЗначения = " Об." + ИмяРеквизита + " ССЫЛКА " + ИмяТаблицы;
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И ВЫРАЗИТЬ(Об." + ИмяРеквизита + " КАК " + ИмяТаблицы + ").Ссылка есть null";
Если Не Метаданные.Перечисления.Содержит(мдОбъекта) Тогда
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И Об." + ИмяРеквизита + " <> Значение(" + ИмяТаблицы + ".ПустаяСсылка)";
КонецЕсли;
Возврат ПроверкаНаПустыеЗначения;
КонецФункции
Функция ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита)
ОбъектТипа = Метаданные.НайтиПоТипу(ТипРеквизита);
ИмяТаблицы = ОбъектТипа.ПолноеИмя();
ОписаниеТипа = """" + ИмяТаблицы + """ КАК ТипДанных";
Возврат ОписаниеТипа;
КонецФункции
Процедура ОграничениеТиповТипДанныхНачалоВыбора(Элемент, СтандартнаяОбработка)
Перем ЭлементСписка;
СтандартнаяОбработка = Ложь;
Строка = ЭлементыФормы.ОграничениеТипов.ТекущиеДанные;
Если Не ПустаяСтрока(Строка.ТипДанных) Тогда
ЭлементСписка = СписокТипов.НайтиПоЗначению(Строка.ТипДанных);
КонецЕсли;
ВыбранныйЭлемент = СписокТипов.ВыбратьЭлемент( , ЭлементСписка);
Если ВыбранныйЭлемент <> Неопределено Тогда
Строка.ТипДанных = ВыбранныйЭлемент.Значение;
КонецЕсли;
КонецПроцедуры
РеквизитыИсключения = Новый Массив;
ТабличныеЧастиИсключения = Новый Массив;
СписокТипов = Новый СписокЗначений;
Для Каждого ОбъектМетаданных Из Метаданные.Справочники Цикл
СписокТипов.Добавить(ОбъектМетаданных.ПолноеИмя(), ОбъектМетаданных.Имя, , БиблиотекаКартинок.СправочникОбъект);
КонецЦикла;
Для Каждого ОбъектМетаданных Из Метаданные.Документы Цикл
СписокТипов.Добавить(ОбъектМетаданных.ПолноеИмя(), ОбъектМетаданных.Имя, , БиблиотекаКартинок.ДокументОбъект);
КонецЦикла;
КоллекцияОбъектов = Новый Массив;
КоллекцияОбъектов.Добавить(Метаданные.ПланыОбмена);
КоллекцияОбъектов.Добавить(Метаданные.Справочники);
КоллекцияОбъектов.Добавить(Метаданные.Документы);
КоллекцияОбъектов.Добавить(Метаданные.ПланыВидовХарактеристик);
КоллекцияОбъектов.Добавить(Метаданные.ПланыСчетов);
КоллекцияОбъектов.Добавить(Метаданные.ПланыВидовРасчета);
КоллекцияОбъектов.Добавить(Метаданные.БизнесПроцессы);
КоллекцияОбъектов.Добавить(Метаданные.Задачи);
КоллекцияРегистров = Новый Массив;
КоллекцияРегистров.Добавить(Метаданные.РегистрыСведений);
КоллекцияРегистров.Добавить(Метаданные.РегистрыНакопления);
КоллекцияРегистров.Добавить(Метаданные.РегистрыБухгалтерии);
КоллекцияРегистров.Добавить(Метаданные.РегистрыРасчета);
Категория:
1С Общие вопросы - Обычные формы Выгрузка табличного документа в Google таблицу Надумал когда-то задачу себе: выгрузить содержимое табличного документа в
Google Document . Одним из вариантов использования данного функционала может быть выгрузка состояния заказов пользователей из базы в 1с в google spreadsheet. Если клиент знает адрес данного документа, то они могут ознакомиться с состоянием дел не звоня менеджеру. Может кто еще придумает варианты использования – пишите в комментарии, буду рад.
Последовательность выгрузки документа такова: сначала получаем список таблиц, которые есть у пользователя в системе Google Document. Затем после определения таблицы выгрузки пользователю предлагаем выбрать лист, в который будет выгружаться содержимое. Во время выбора всех этих параметров так же предоставляется возможность создания новых элементов (таблиц, листов). Уже после определения листа выгрузки обходим все ячейки документа и их содержимое переносим в таблицу на соответствующее место. Вопрос сохранения форматирования табличного документа в данной задаче не рассматривался.
Для написания функционала использовалась информация про
google document API . Для того чтобы получить доступ к данным необходимо чтобы 1с сначала прошла аутентификацию. Про аутентификацию приложений можно почитать в соответствующем документе. Для того чтобы пройти аутентификацию мы должны сначала получить маркер, затем этот маркер прописывать каждый раз при обращении к серверу.
Функция получения маркера следующая:
Код 1C v 8.х Функция ПолучитьМаркер(ВидСервиса,Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя();
Если ПараметрыПользователя = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
АдресКлиентЛогин = "https://www.google.com/accounts/ClientLogin";
Если ВидСервиса = "Таблица" Тогда
Сервис = "wise";
ИначеЕсли ВидСервиса = "Документ" Тогда
Сервис = "writely";
КонецЕсли;
Попытка
ХМЛХТТП = ПолучитьCOMОбъект("", "Microsoft.XMLHTTP");
ХМЛХТТП.Open("POST", АдресКлиентЛогин, Ложь);
ХМЛХТТП.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ХМЛХТТП.Send("Email=" + ПараметрыПользователя.Логин + "&Passwd=" + ПараметрыПользователя.Пароль + "&service=" + Сервис + "&source=Gulp-CalGulp-1.05");
Исключение
Сообщить("Ошибка:" + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Если ХМЛХТТП.Status = 200 Тогда
Маркер = ХМЛХТТП.ResponseText;
Маркер = Прав(Маркер, СтрДлина(Маркер) - СтрДлина("Auth=") - Найти(Маркер, "Auth=") + 1);
Возврат Маркер;
Иначе
Сообщить("Ошибка:" + ХМЛХТТП.Status + "-" + ХМЛХТТП.ResponseText);
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция получения маркера в качестве входного параметра получает вид службы, для которой будет проходить аутентификация. Это очень важный момент. Например, полученный маркер для Календаря не даст возможности работать с документами.
Для получения списка таблиц отправляется GET запрос по адресу «https://spreadsheets.google.com/feeds/spreadsheets/private/full». В запросе параметр «Authorization» определяется значением полученного маркера аутентификации. В результате выполнения запроса в ResponseText мы получаем xml, который для удобство дальнейшего разбора перегоняется в ДеревоЗначений.Функция получения списка таблиц имеет следующий вид:
Код 1C v 8.х &НаСервере
Функция ПолучитьСписокТаблиц(Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя();
Если ПараметрыПользователя = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Маркер = ПолучитьМаркер("Таблица");
Если Маркер = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Адрес = "https://spreadsheets.google.com/feeds/spreadsheets/private/full";
ХМЛХТТП = ПолучитьCOMОбъект("", "Microsoft.XMLHTTP");
ХМЛХТТП.Open("GET", Адрес, Ложь);
ХМЛХТТП.SetRequestHeader("Content-Type", "application/atom+xml");
ХМЛХТТП.SetRequestHeader("Authorization", "GoogleLogin auth=" +Маркер);
ХМЛХТТП.Send(Null);
Если ХМЛХТТП.Status = 200 Тогда
ОтветСервера = ХМЛХТТП.ResponseText;
ДеревоXML = ПрочитатьResponseTextXML(ОтветСервера);
СписокТаблиц = Новый СписокЗначений;
ТаблицаСсылка = "";
НазваниеТаблицы = "";
Для Каждого Строка Из ДеревоXML.Строки[0].Строки Цикл
Если Строка.ИмяXMLЭлементаДанных = "entry" Тогда
Для Каждого ТекАтрибут Из Строка.Строки Цикл
Если ТекАтрибут.ИмяXMLЭлементаДанных = "link" Тогда
ТекРел = ТекАтрибут.СписокАтрибутов.НайтиПоЗначению("rel");
Если ТекРел.представление = "http://schemas.google.com/spreadsheets/2006#worksheetsfeed" Тогда
ТекСсылка = ТекАтрибут.СписокАтрибутов.НайтиПоЗначению("href");
ТаблицаСсылка = ТекСсылка.Представление;
ТаблицаСсылка = СтрЗаменить(ТаблицаСсылка,"https://","http://");
КонецЕсли;
КонецЕсли;
Если ТекАтрибут.ИмяXMLЭлементаДанных = "title" Тогда
НазваниеТаблицы = ТекАтрибут.ЗначениеXMLЭлементаДанных;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ТаблицаСсылка) И ЗначениеЗаполнено(НазваниеТаблицы) Тогда
СписокТаблиц.Добавить(ТаблицаСсылка,НазваниеТаблицы);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат СписокТаблиц;
Иначе
Сообщить("Ошибка:" + ХМЛХТТП.Status + "-" + ХМЛХТТП.ResponseText);
Возврат Неопределено;
КонецЕсли;
КонецФункции
Теперь остановимся на самой выгрузке значения в ячейку google таблицы. Для определения значения в ячейке выполняется POST запрос по адресу листа таблицы, который пользователь определил до этого. Успешность выполнения обновления контролируется по значению Status, в случае удачного обновления он должен быть равен 201. Функция обновления значения ячейки на листе Google таблицы имеет следующий вид:
Код 1C v 8.х &НаСервере
Функция ОбновитьЯчейкуЛистаГугл(Маркер,ИДЛиста,Строка,Колонка,Значение)
ТекстСоздания = "
| " + ИДЛиста + "/R" + Строка(Строка) + "C" + Строка(Колонка)+"
| + ИДЛиста + "/R"+ Строка(Строка) + "C" + Строка(Колонка)+"""/>
| + Строка(Строка) + """ col=""" + Строка(Колонка)+ """ inputValue=""" + Значение+"""/>
| ";
ХМЛХТТП = ПолучитьCOMОбъект("", "Microsoft.XMLHTTP");
ХМЛХТТП.Open("POST", ИДЛиста, Ложь);
ХМЛХТТП.SetRequestHeader("Content-Type", "application/atom+xml;type=feed");
ХМЛХТТП.SetRequestHeader("X-If-No-Redirect", "true");
ХМЛХТТП.SetRequestHeader("Authorization", "GoogleLogin auth=" + Маркер);
ХМЛХТТП.Send(ТекстСоздания);
Если ХМЛХТТП.Status = 201 Тогда
Возврат Истина;
Иначе
Сообщить("Ошибка:" + ХМЛХТТП.Status + "-" + ХМЛХТТП.ResponseText);
Возврат Ложь;
КонецЕсли;
КонецФункции
Источник Категория:
Табличный документ Поле выбора ~ Как ограничить список выбора? Ограничим список элементов, установив отбор в открываемой форме
Код 1C v 8.х //Пример 1
Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ФормаВыбора = Справочники.ПрочиеДоходыИРасходы.ПолучитьФормуВыбора(, Элемент);
ЭлементОтбораВидПДР = ФормаВыбора.Отбор.ВидПрочихДоходовИРасходов;
Если ЭлементОтбораВидПДР <> Неопределено Тогда
ЭлементОтбораВидПДР.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбораВидПДР.Значение = Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеВнереализационныеДоходыРасходы;
ЭлементОтбораВидПДР.Использование = Истина;
КонецЕсли;
// Закроем доступ к настройке отбора. Таким образом, пользователь не может отключить заданный программно отбор
// и имеет возможность сделать выбор значения только из ограниченного списка.
ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.ВидПрочихДоходовИРасходов.Доступность = Ложь;
ФормаВыбора.Открыть();
СтандартнаяОбработка = Ложь;
КонецПроцедуры
//Пример 2
Процедура СчетДтНачалоВыбора(Элемент, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Хозрасчетный.Ссылка
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Родитель В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))
| И Хозрасчетный.ЗапретитьИспользоватьВПроводках = ЛОЖЬ";
СписокСчетов = Новый СписокЗначений;
СписокСчетов.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"));
ФормаВыбора = ПланыСчетов.Хозрасчетный.ПолучитьФормуВыбора(, Элемент);
ЭлементОтбораСсылка = ФормаВыбора.Отбор.Ссылка;
Если ЭлементОтбораСсылка <> Неопределено Тогда
ЭлементОтбораСсылка.ВидСравнения = ВидСравнения.ВСписке;
ЭлементОтбораСсылка.Значение = СписокСчетов;
ЭлементОтбораСсылка.Использование = Истина;
КонецЕсли;
ФормаВыбора.ЭлементыФормы.Список.НастройкаОтбора.Ссылка.Доступность = Ложь;
ФормаВыбора.Открыть();
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Использование выбора из списка
Код 1C v 8.х //Пример 1
Процедура ВидПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ВидыПДР = Новый СписокЗначений;
ВидыПДР.Добавить(Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеВнереализационныеДоходыРасходы);
ВидыПДР.Добавить(Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеОперационныеДоходыРасходы);
ВыбранныйЭлемент = ВыбратьИзСписка(ВидыПДР, Элемент, ВидыПДР.НайтиПоЗначению(Элемент.Значение));
Если ВыбранныйЭлемент <> Неопределено Тогда
Элемент.Значение = ВыбранныйЭлемент.Значение;
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецПроцедуры
//Пример 2
Процедура СчетКтНачалоВыбора(Элемент, СтандартнаяОбработка)
СчетаКт = Новый СписокЗначений;
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПодотчетнымиЛицами);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПрочимиПоставщикамиИПодрядчиками);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыПоТекущимОперациям);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.ПрочиеДоходы);
ВыбранныйЭлемент = ВыбратьИзСписка(СчетаКт, Элемент, СчетаКт.НайтиПоЗначению(Элемент.Значение));
Если ВыбранныйЭлемент <> Неопределено Тогда
Элемент.Значение = ВыбранныйЭлемент.Значение;
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Категория:
Работа с Формой (Диалог) и её элементами Как Выбрать Месяц формирования отчета? Код 1C v 8.х //Выберите месяц формирования
СписокМесяцев = Новый СписокЗначений;
ТекДата = НачалоМесяца(РабочаяДата);
Для Мес = -15 по 15 Цикл
ТекМес = ДобавитьМесяц(ТекДата, Мес);
СписокМесяцев.Добавить(ТекМес, Формат(ТекМес, "ДФ='ММММ гггг'"));
КонецЦикла;
ВыбранЗначение = СписокМесяцев.ВыбратьЭлемент("Выберите месяц:", СписокМесяцев.НайтиПоЗначению(ТекДата));
Если ВыбранЗначение = Неопределено Тогда
Сообщить("Месяц не выбран ");
Иначе
Сообщить("Первый день выбранного месяца: "+ ВыбранЗначение.Значение);
Сообщить("Представление выбранного месяца: "+ ВыбранЗначение.Представление);
КонецЕсли;
При выборе Май 2010 получаем:
Первый день выбранного месяца: 01.05.2010 0:00:00
Представление выбранного месяца: Май 2010
вот так это выглядит:
Категория:
Работа с Датами (Временем) Поле выбора ~ Как отобрать значения выводящиеся в список выбора у элемента формы поле выбора? Использование отбора:
Функционал, который используется для интерактивного отбора в списках, можно использовать и для отбора программным способом.
Для этого нужно для
события НачалоВыбора соответствующего поля ввода определить процедуру обработки и внутри процедуры программно устанавить отбор для списка.
Далее следует пример процедуры обработки
события НачалоВыбора для поля ввода
СтатьяПДР . Реквизит (и поле ввода, соответственно)
СтатьяПДР имеет тип
СправочникСсылка.ПрочиеДоходыИРасходы . Для списка справочника «Прочие доходы и расходы» устанавливается отбор по реквизиту «Вид прочих доходов и расходов» со значением «Прочие внереализационные доходы (расходы)».
Код 1C v 8.х Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ФормаВыбора = Справочники.ПрочиеДоходыИРасходы.ПолучитьФормуВыбора(, Элемент);
ЭлементОтбораВидПДР = ФормаВыбора.Отбор.ВидПрочихДоходовИРасходов;
Если ЭлементОтбораВидПДР <> Неопределено Тогда
ЭлементОтбораВидПДР.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбораВидПДР.Значение = Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеВнереализационныеДоходыРасходы;
ЭлементОтбораВидПДР.Использование = Истина;
КонецЕсли;
ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.ВидПрочихДоходовИРасходов.Доступность = Ложь;
ФормаВыбора.Открыть();
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Обратите внимание на строку кода:
Код 1C v 8.х ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.ВидПрочихДоходовИРасходов.Доступность = Ложь;
Она закрывает доступ к настройке отбора «Вид прочих доходов и расходов». Таким образом, пользователь не может отключить заданный программно отбор и имеет возможность сделать выбор значения только из ограниченного списка.
Внутри процедуры обработки события НачалоВыбора параметру СтандартнаяОбработка нужно обязательно присвоить значение Ложь. В противном случае будет открыт и ограниченный список, и стандартный список, а это, конечно, не входит в наши планы.
В следующем примере для поля ввода СчетДт типа ПланСчетовСсылка.Хозрасчетный
устанавливается отбор в виде списка счетов . Список счетов предварительно формируется с помощью запроса.
Код 1C v 8.х Процедура СчетДтНачалоВыбора(Элемент, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Хозрасчетный.Ссылка
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Родитель В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))
| И Хозрасчетный.ЗапретитьИспользоватьВПроводках = ЛОЖЬ";
СписокСчетов = Новый СписокЗначений;
СписокСчетов.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"));
ФормаВыбора = ПланыСчетов.Хозрасчетный.ПолучитьФормуВыбора(, Элемент);
ЭлементОтбораСсылка = ФормаВыбора.Отбор.Ссылка;
Если ЭлементОтбораСсылка <> Неопределено Тогда
ЭлементОтбораСсылка.ВидСравнения = ВидСравнения.ВСписке;
ЭлементОтбораСсылка.Значение = СписокСчетов;
ЭлементОтбораСсылка.Использование = Истина;
КонецЕсли;
ФормаВыбора.ЭлементыФормы.Список.НастройкаОтбора.Ссылка.Доступность = Ложь;
ФормаВыбора.Открыть();
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Использование выбора из списка:
Выбор значения
Перечисления обычно осуществляется из маленького списка. Но даже если включить выбор из формы (это делается с помощью свойства «Быстрый выбор» поля ввода), функционал отбора для перечислений все равно неприменим.
В таком случае подходящий способ ограничения списка выбора - использование метода формы ВыбратьИзСписка. Аналогично первому способу, необходимо определить процедуру обработки события НачалоВыбора для поля ввода значения. В следующем примере для поля ввода ВидПДР типа ПеречислениеСсылка.ВидыПрочихДоходовИРасходов программно устанавливается ограниченный список выбора.
Код 1C v 8.х Процедура ВидПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
ВидыПДР = Новый СписокЗначений;
ВидыПДР.Добавить(Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеВнереализационныеДоходыРасходы);
ВидыПДР.Добавить(Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеОперационныеДоходыРасходы);
ВыбранныйЭлемент = ВыбратьИзСписка(ВидыПДР, Элемент, ВидыПДР.НайтиПоЗначению(Элемент.Значение));
Если ВыбранныйЭлемент <> Неопределено Тогда
Элемент.Значение = ВыбранныйЭлемент.Значение;
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Результат работы процедуры показан на рисунке. Метод ВыбратьИзСписка открывает маленький список с набором значений, переданных в процедуру в первом параметре (в примере - список значений ВидыПДР).
Пример ограничения списка выбора для перечисления в 1С 8
Пример для других агрегатных типов:
Код 1C v 8.х Процедура СчетКтНачалоВыбора(Элемент, СтандартнаяОбработка)
СчетаКт = Новый СписокЗначений;
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПодотчетнымиЛицами);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПрочимиПоставщикамиИПодрядчиками);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыПоТекущимОперациям);
СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.ПрочиеДоходы);
ВыбранныйЭлемент = ВыбратьИзСписка(СчетаКт, Элемент, СчетаКт.НайтиПоЗначению(Элемент.Значение));
Если ВыбранныйЭлемент <> Неопределено Тогда
Элемент.Значение = ВыбранныйЭлемент.Значение;
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Категория:
Работа с Формой (Диалог) и её элементами Как сделать подбор элементов справочника в табличную часть документа? Нужно на форме документа сделать кнопочку Подбор для справочника сотрудники и чтобы выбранные элементы добавлялись в табличное поле документа?
В данной статье я приведу пример подбора элемента справочника в Список значений и в Табличную часть!
Создаем на форме следующие элементы:
Логика такова:
При нажатии на кнопку
ПОДБОР (Процедура КоманднаяПанельПодбор) должена открыться форма подбора сотрудников:
Для Списка значений (СЗ) - ОткрытьФормуВыбораСотрудника(ЭлементыФормы.СписокСотрудников, ЭтотОбъект, Ложь, );
Для Табличного поля (ТП) - ОткрытьФормуВыбораСотрудника(ЭлементыФормы.ТабличноеПолеРаботники, ЭтотОбъект, Ложь, );
Далее открывается форма подбора сотрудника, при двойном щелчке - сотрудник должен добавится в СЗ или ТП.
Для этого у СЗ и ТП в Свойства - События добавляем ОбработкуВыбора :
Для Списка значений (СЗ) - Процедура СписокСотрудниковОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Для Табличного поля (ТП) - Процедура ТабличноеПолеРаботникиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
А в них пропишем проверку, добавлен сотрудник или нет - чтобы не было задвоений!
И так, код будет следующий:
Код 1C v 8.х //Процедура кнопки очистить список значений
Процедура КоманднаяПанельОчистить(Кнопка)
СписокСотрудников.Очистить();
КонецПроцедуры
// Процедура открывает форму выбора сотрудников организации
// Параметры:
// Владелец - владелец формы
// Ключ - ключ, ссылка на объект из которого открывается форма
// ЗакрыватьПриВыборе - Булево, закрывать ли нет
// ГоловнаяОрганизация - головная организация
//
Процедура ОткрытьФормуВыбораСотрудника(Владелец, Ключ, ЗакрыватьПриВыборе, ГоловнаяОрганизация = Неопределено) Экспорт
СтандартнаяОбработка = Ложь;
Форма = Справочники.СотрудникиОрганизаций.ПолучитьФормуВыбора(, Владелец, Ключ);
Форма.ЗакрыватьПриВыборе = ЗакрыватьПриВыборе;
//установим отборы по организации и виду договора
Если ЗначениеЗаполнено(ГоловнаяОрганизация) Тогда
Форма.Отбор.Организация.Установить(ГоловнаяОрганизация);
Форма.Отбор.Организация.Использование = ЗначениеЗаполнено(ГоловнаяОрганизация);
КонецЕсли;
СписокДоговоров = Новый СписокЗначений;
СписокДоговоров.Добавить(Перечисления.ВидыДоговоровСФизЛицами.ТрудовойДоговор);
СписокДоговоров.Добавить(Перечисления.ВидыДоговоровСФизЛицами.Подряда);
СписокДоговоров.Добавить(Перечисления.ВидыДоговоровСФизЛицами.Авторский);
Форма.Отбор.ВидДоговора.ВидСравнения = ВидСравнения.ВСписке;
Форма.Отбор.ВидДоговора.Использование = Истина;
Форма.Отбор.ВидДоговора.Значение = СписокДоговоров;
//Открываем форму выбора
Форма.Заголовок = "Выберите работников:";
Форма.Открыть();
КонецПроцедуры
//Процедура кнопки подбор
Процедура КоманднаяПанельПодбор(Кнопка)
// Процедура для подбора в табличное поля
ОткрытьФормуВыбораСотрудника(ЭлементыФормы.ТабличноеПолеРаботники, ЭтотОбъект, Ложь, );
// Процедура для подбора в список значений
ОткрытьФормуВыбораСотрудника(ЭлементыФормы.СписокСотрудников, ЭтотОбъект, Ложь, );
КонецПроцедуры
//Обработка Выбора значения для списка значений
Процедура СписокСотрудниковОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.СотрудникиОрганизаций") Тогда
//Для того чтобы не было задвоений при выборе, наложим условие
Если СписокСотрудников.НайтиПоЗначению(ВыбранноеЗначение) = Неопределено Тогда
НоваяСтрока = СписокСотрудников.Добавить();
НоваяСтрока.Значение = ВыбранноеЗначение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Обработка Выбора значения для табличного поля
Процедура ТабличноеПолеРаботникиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.СотрудникиОрганизаций") Тогда
//Для того чтобы не было задвоений при выборе, наложим условие
Если ТабличноеПолеРаботники.НайтиСтроки(Новый Структура("Работник", ВыбранноеЗначение)).Количество() = 0 Тогда
НоваяСтрока = ТабличноеПолеРаботники.Добавить();
НоваяСтрока.Работник = ВыбранноеЗначение;
// далее можно описать заполнение других колонок табличного поля
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Автор: Мигачев Евгений Категория:
Справочники Функция проверки наличия только русских букв в строке допускаются пробелы и дефис и спецсимволы Код 1C v 8.х Функция СтрокаНаписанаПоРусски(Знач СтрокаПараметр) Экспорт
СтрокаПараметр = СокрЛП(СтрокаПараметр);
СписокДопустимыхЗначений = Новый СписокЗначений;
СписокДопустимыхЗначений.Добавить(184);
СписокДопустимыхЗначений.Добавить(168);
СписокДопустимыхЗначений.Добавить(45);
СписокДопустимыхЗначений.Добавить(46);
СписокДопустимыхЗначений.Добавить(32);
СписокДопустимыхЗначений.Добавить(48);
СписокДопустимыхЗначений.Добавить(49);
СписокДопустимыхЗначений.Добавить(50);
СписокДопустимыхЗначений.Добавить(51);
СписокДопустимыхЗначений.Добавить(52);
СписокДопустимыхЗначений.Добавить(53);
СписокДопустимыхЗначений.Добавить(54);
СписокДопустимыхЗначений.Добавить(55);
СписокДопустимыхЗначений.Добавить(56);
СписокДопустимыхЗначений.Добавить(57);
Для Сч=1 По СтрДлина(СтрокаПараметр) Цикл
Код = КодСимвола(СтрокаПараметр,Сч);
Если (Код<192) И (СписокДопустимыхЗначений.НайтиПоЗначению(Код) = Неопределено) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Категория:
Работа с Текстом (Строкой) Функция преобразования строки вида "ДебиторкаПоКонтрагентам" в "Дебиторка по контрагентам" Примеры кода для 7 версии, но будут работать и в 8-ой
Код 1C v 7.x Функция мРазнПреобразоватьСтрокуСБольшимиБуквами(ИсходнаяСтрока) Экспорт
СтрокаВозврата = Сред(ИсходнаяСтрока, 1, 1);
Для Сч = 2 По СтрДлина(ИсходнаяСтрока) цикл
ПредСимвол = Сред(ИсходнаяСтрока, Сч - 1, 1);
ТекСимвол = Сред(ИсходнаяСтрока, Сч, 1);
СледСимвол = Сред(ИсходнаяСтрока, Сч + 1, 1);
Если ВРЕГ(ТекСимвол) = ТекСимвол тогда
Если ВРЕГ(ПредСимвол) <> ПредСимвол тогда
СтрокаВозврата = СтрокаВозврата + " ";
Если ВРЕГ(СледСимвол) <> СледСимвол тогда
ТекСимвол = НРЕГ(ТекСимвол);
КонецЕсли;
КонецЕсли;
КонецЕсли;
СтрокаВозврата = СтрокаВозврата + ТекСимвол;
КонецЦикла;
Возврат СтрокаВозврата;
КонецФункции // мРазнПреобразоватьСтрокуСБольшимиБуквами()
А таким кодом, просто перед большой буквой выставляется пробел:
Код 1C v 7.x
Список=новый СписокЗначений;
Для н=КодСимвола("А") По КодСимвола("Я") Цикл
Список.Добавить(Символ(н));
КонецЦикла;
Значение="ДебиторкаПоКонтрагентам";
Результат="";
Для н=1 По СтрДлина(Значение) Цикл
Сим=Сред(Значение,н,1);
Если Список.НайтиПоЗначению(Сим) <> Неопределено Тогда
Сим=" "+Сим;
КонецЕсли;
Результат=Результат+Сим;
КонецЦикла;
Сообщить(Результат);
Категория:
Работа с Текстом (Строкой) Удаление значения из списка значений Код 1C v 8.х
//Удаление по индексу
СписокТиповЦен.Удалить(1);
//Выборочное удаление по индексу
Индекс = СписокВидов.Количество() - 1;
Пока Индекс >= 0 Цикл
Если ТипЗнч(СписокВидов[Индекс].Значение) = Тип("Число") Тогда
СписокВидов.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
// удаление по элементу
НайденныйЭлемент = СписокТиповЦен.НайтиПоЗначению(ВыбЗначение);
Если НайденныйЭлемент <> Неопределено Тогда
СписокТиповЦен.Удалить(НайденныйЭлемент);
Иначе
Сообщить("Значение не найдено!");
КонецЕсли;
Категория:
Работа с Списком Значений Функция проверяет наличие в строке только цифр Код 1C v 8.х
// Функция проверяет наличие в строке только цифр
//
// Параметры
// СтрокаПроверки - Строка для проверки только цифр
//
// Возвращаемое значение:
// Булево
//
Функция ЕстьНеЦифры(Знач СтрокаПроверки) Экспорт
СписокКодовЧисел = Новый СписокЗначений;
Для а = 48 По 57 Цикл
СписокКодовЧисел.Добавить(а);
КонецЦикла;
СтрокаПроверки = СокрЛП(СтрокаПроверки);
Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
Возврат Истина;
Иначе
Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
Если СписокКодовЧисел.НайтиПоЗначению(КодСимвола(Сред(СтрокаПроверки, а, 1))) = Неопределено Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Ложь;
КонецФункции
Категория:
Работа с Текстом (Строкой) Функция проверяет наличие в строке только цифр Код 1C v 8.х
// Функция проверяет наличие в строке только цифр
//
// Параметры
// СтрокаПроверки - Строка для проверки только цифр
//
// Возвращаемое значение:
// Булево
//
Функция ЕстьНеЦифры(Знач СтрокаПроверки) Экспорт
СписокКодовЧисел = Новый СписокЗначений;
Для а = 48 По 57 Цикл
СписокКодовЧисел.Добавить(а);
КонецЦикла;
СтрокаПроверки = СокрЛП(СтрокаПроверки);
Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
Возврат Истина;
Иначе
Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
Если СписокКодовЧисел.НайтиПоЗначению(КодСимвола(Сред(СтрокаПроверки, а, 1))) = Неопределено Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Ложь;
КонецФункции
Категория:
Полезные, Универсальные Функции