Вывод в поле Наименование справочника Штатное список значений из справочника Подразделения? Есть два справочника Штатное и Подразделения. В справочнике Штатное есть автоматически генерируемое поле Наименование. Как программно сделать так чтобы в поле Наименование справочника Штатное выводились списком значений из поля Наименование справочника Подразделения? Я только начал изучать программирование в 1С. Вариант с добавлением в код модуля списка выбора я уже реализовал. Но сами понимаете что это не то. Посмотрите код. Может у кого то решение есть лучше.
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Наименование.РежимВыбораИзСписка = Истина;
Элементы.Наименование.СписокВыбора.Добавить("Администрация");
Элементы.Наименование.СписокВыбора.Добавить("Бухгалтерия");
Элементы.Наименование.СписокВыбора.Добавить("Отдел ИТ");
КонецПроцедуры
&НаКлиенте
Процедура ТЧШтатноеЕдиницыПриИзменении(Элемент)
РассчитатьСуммуТЧШтатное();
КонецПроцедуры
&НаКлиенте
Процедура ТЧШтатноеОкладПриИзменении(Элемент)
РассчитатьСуммуТЧШтатное();
КонецПроцедуры
&НаКлиенте
Процедура ТЧШтатноеСуммаПриИзменении(Элемент)
Стр = Элементы.ТЧШтатное.ТекущиеДанные;
Если Стр.Единицы=0 И Стр.Оклад=0 Тогда
ИначеЕсли Стр.Единицы=0 Тогда
Стр.Единицы=Стр.Сумма / Стр.Оклад;
ИначеЕсли Стр.Оклад=0 Тогда
Стр.Оклад=Стр.Сумма / Стр.Единицы;
Иначе
Стр.Оклад=Стр.Сумма / Стр.Единицы;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьСуммуТЧШтатное()
Стр = Элементы.ТЧШтатное.ТекущиеДанные;
Стр.Сумма = Стр.Единицы * Стр.Оклад;
КонецПроцедуры
&НаКлиенте
Процедура ЕдиницыИтогПриИзменении(Элемент)
Стр = Элементы.Штатное.ТекущиеДанные;
Стр.ЕдиницыИтог = Стр.Единицы + 1;
КонецПроцедуры
&НаКлиенте
Процедура СуммаИтогПриИзменении(Элемент)
Стр = Элементы.Штатное.ТекущиеДанные;
Стр.СуммаИтог = Стр.Сумма + 1;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Объект.ЕдиницыИтог = Объект.ТЧШтатное.Итог("Единицы");
Объект.СуммаИтог = Объект.ТЧШтатное.Итог("Сумма");
КонецПроцедуры
Категория:
Справочники Как удалить движения документа программно? Потребовалось в УТ быстро удалить все движения по банку, дело вроде легкое - отменить проведение всех поступлений и списаний безналичных денежных средств, но не тут то было...
При попытке отмены проведения выполнялись проверки на условия оплаты по заказу и документ ни как не отменял проведения
Ну не может типовым способом, заставим не типовым: Через запрос делаем выбору необходимых нам документов и в обработке результата пишем:
Код 1C v 8.3 Для Каждого СтрокаРезультата Из РезультатТаблица Цикл
//алгоритм обработки строки результата - начало
ДокОбъект = СтрокаРезультата.Ссылка.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
ДокОбъект.Проведен = Ложь;
//ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать(режимзаписидокумента.запись);
//алгоритм обработки строки результата - конец
КонецЦикла;
Готовая функция для использования в своих обработка х или общем модуле:
Код 1C v 8.3 Процедура УдалитьДвиженияДокумента(Документ)
ДокОбъект = Документ.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Категория:
Документы Как уменьшить вес картинок в базе данных или изменить размер, ширину или высоту картинок? Иногда возникает необходимость обработать фотографии в 1С автоматически, уменьшить вес картинок в килобайтах, за счет удаления из файла не нужной технической информации и сглаживания цветов, или изменить размер, уменьшить картинку пропорционально задав максимальный размер по ширине или высоте.В этом случае можно:1) установить специальные библиотеки в операционной системе для работы с графикой, н-р GFLAx и подключать их как com-объекты2) использовать api сервисов, таких как optipic.io .
Рассмотрим оба варианта:1) Использование GFLAxСкачиваем и устанавливаем библиотеку GFLAx, скачать можно здесь https://www.xnview.com/en/#downloads
Далее её надо зарегистрировать в Windows. Для этого запускаем CMD.exe с правами администратора и набираем: regsrv32 "путь_к_DLL\GFLAx.dll"Далее уже в программе, для пропорционального изменения размера файла до максимального размера в 500 пикселей можно вставить такой код:
Код 1C v 8.х GFLAx = Новый COMОбъект("GFLAx.GFLAx");
GFLAx.LoadBitmap(ИмяИсходногоФайла);
// Получаем исходный размер картинки
Ширина = GFLAx.Width;
Высота = GFLAx.Height;
//определяем максимальную сторону по которой будем проводить пропорциональное изменениеДелитель= ?(Ширина>Высота, Делитель=Ширина/500, Делитель=Высота/500);
НоваяШирина = Ширина/Делитель;
НоваяВысота = Высота/Делитель;
GFLAx.Resize(Цел(НоваяШирина),Цел(НоваяВысота));
GFLAx.SaveBitmapИмяВыходногоФайла);
Данный способ требует специальных настроек операционной системы, навыков системного администрирования и данный способ не проводит полноценную оптимизацию картинки.Кроме того, на компьютере или сервере, где производиться оптимизация эта библиотека должна быть установлена.2) Использование сервиса optipic.io Подобные сервисы обычно платные, но стоимость использования не высокая, а качество и гибкость существенно выше.
Преимущества использования сервиса optipic.io в проектах 1С:
Легко подключить Не нужно устанавливать дополнительные библиотеки в операционной системе Можно использовать как для оптимизации изображений, так и для изменения размера изображения в пикселях (ресайз) Не зависит от операционной системы и типа используемого клиента Конфигурация будет работать после переезда на другой компьютер или сервер Качество и эффективность сжатия производятся в самом оптимальном виде Использование сервиса можно легко встроить в любой свой проект на 1С. Для этого можно добавить себе функцию, в которую передавать имя файла с исходной картинкой и параметры оптимизации. А в качестве ответа получить имя файла уже оптимизированного сервисом.
Пример такой функции для 1C8:
Код 1C v 8.х Функция ОптимизироватьКартинку(ФайлКартинкиИсходный, Качество=70, НужноИзменятьРазмер=Ложь, МаксимальнаяШирина=1000, МаксимальнаяВысота=1000) Экспорт
ssl = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
email = "ВашEmail";
Пароль = "ВашПароль";
Соедиенение = Новый HTTPСоединение("optipic.io", , email, Пароль, , ,ssl);
СкриптНаСайте = "api/compress?quality="+Качество+"&from=1c";
Если НужноИзменятьРазмер Тогда
СкриптНаСайте = СкриптНаСайте + "&maxwidth="+Формат(МаксимальнаяШирина, "ЧГ=")+"&maxheight="+Формат(МаксимальнаяВысота, "ЧГ=");
КонецЕсли;
НовыйФайлКартинки = ПолучитьИмяВременногоФайла();
Попытка
Результат = Соедиенение.ОтправитьДляОбработки(ФайлКартинкиИсходный, СкриптНаСайте, НовыйФайлКартинки);
Возврат НовыйФайлКартинки;
Исключение
//Обработка ошибки
//Не удалось получить файл
//Или нужно пополнить баланс
Возврат ФайлКартинкиИсходный;
КонецПопытки;
КонецФункции
И далее в коде обращаться к данной функции, н-р так
Код 1C v 8.х НовыйФайл = ОптимизироватьКартинку(ФайлКартинкиИсходный, 70, Истина, 500, 500);
Категория:
1С ERP Управление предприятием 2.0 Как в УТ 11.3, в справочник номенклатуры добавить остатки на складах и актуальные цены Попросил клиент добавить в справочник номенклатуры остатки и цены на текущий момент. Нужно!? Делаем:
1. Открываем форму списка номенклатуры и в свойства СписокНоменклатуры - Настройка списка
Корректируем запрос добавляя выборку по остаткам склада, новый вариант:
Код 1C v 8.3 ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК Ссылка,
СпрНоменклатура.Код КАК Код,
СпрНоменклатура.Наименование КАК Наименование,
СпрНоменклатура.Артикул КАК Артикул,
СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
СпрНоменклатура.СтавкаНДС КАК СтавкаНДС,
СпрНоменклатура.Родитель,
ВЫБОР
КОГДА СпрНоменклатура.ЕстьТоварыДругогоКачества
ТОГДА 4 + ВЫБОР
КОГДА СпрНоменклатура.ПометкаУдаления
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ + ВЫБОР
КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
ТОГДА 0
ИНАЧЕ 2
КОНЕЦ
ИНАЧЕ ВЫБОР
КОГДА СпрНоменклатура.ПометкаУдаления
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ + ВЫБОР
КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
ТОГДА 0
ИНАЧЕ 2
КОНЕЦ
КОНЕЦ КАК ИндексКартинки,
ТоварыНаСкладахОстатки1.ВНаличииОстаток КАК Остаток_Про,
ТоварыНаСкладахОстатки2.ВНаличииОстаток КАК Остаток_Лемм
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(,
Склад =Склад1
) КАК ТоварыНаСкладахОстатки1
ПО (ТоварыНаСкладахОстатки1.Номенклатура = СпрНоменклатура.Ссылка)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(,
Склад =Склад2
) КАК ТоварыНаСкладахОстатки2
ПО (ТоварыНаСкладахОстатки2.Номенклатура = СпрНоменклатура.Ссылка)
ГДЕ
НЕ СпрНоменклатура.ЭтоГруппа
{ГДЕ
(СпрНоменклатура.Ссылка В
(ВЫБРАТЬ
Сегменты.Номенклатура
ИЗ
РегистрСведений.НоменклатураСегмента КАК Сегменты
ГДЕ
Сегменты.Сегмент =СегментНоменклатуры))}
2. Устанавливаем параметры в Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Код 1C v 8.3 СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("Склад1", Справочники.Склады.НайтиПоНаименованию("PRO"));
СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("Склад2", Справочники.Склады.НайтиПоНаименованию("ЛЕММ"));
Цены.Параметры.УстановитьЗначениеПараметра("КонПериода", ТекущаяДата());
Добавляем Динамический список Цены:
В свойствах произвольный запрос:
Код 1C v 8.3 ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЦеныНоменклатурыСрезПоследних.Номенклатура,
ЦеныНоменклатурыСрезПоследних.ВидЦены,
ЦеныНоменклатурыСрезПоследних.Характеристика,
ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&КонПериода, ) КАК ЦеныНоменклатурыСрезПоследних
И для списка номенклатуры пропишем обновление цен при активизации строки
Код 1C v 8.3
Цены.Отбор.Элементы.Очистить();
НовыйЭлементОтбора = Цены.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ПолеОтбора = Новый ПолеКомпоновкиДанных("Номенклатура");
НовыйЭлементОтбора.ЛевоеЗначение = ПолеОтбора;
НовыйЭлементОтбора.Использование = Истина;
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйЭлементОтбора.ПравоеЗначение = ?(Элемент.ТекущиеДанные <> Неопределено, Элемент.ТекущиеДанные.Ссылка,ВернутьЗначениеНоменклатура());
В результате:
Клиент доволен, а это самое главное
Если Вам нужна аналогичная настройка, обращайтесь, контакты тут
Категория:
1С Управление торговлей 11 Проверка на дублирование контрагентов по ИНН и КПП Часто клиенты просят включить при записи контрагента проверку на дублирование, в некоторых конфигурациях это встроенный функционал, а если этого нет, то:
1. Создаем общий модуль
и помещаем в него процедуру:
Код 1C v 8.3 //Проверка ИНН на дублирование
Процедура ЗапретДублированияКонтрагентовОбработкаПроверкиЗаполнения(ИНН, КПП, Источник, Отказ) Экспорт
// Проверка осуществляется только для контрагентов с заполненным ИНН и КПП
Если Не ЗначениеЗаполнено(ИНН) ИЛИ Не ЗначениеЗаполнено(КПП) Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПРЕДСТАВЛЕНИЕ(Контрагенты.Код) КАК Код,
| Контрагенты.Наименование,
| ПРЕДСТАВЛЕНИЕ(Контрагенты.КПП) КАК КПП
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН =ИНН
| И Контрагенты.КПП =КПП";
Если Не ЗначениеЗаполнено(Источник) Тогда
Запрос.Текст = Запрос.Текст + "
|И Контрагенты.Ссылка <>ссылкаТекущийКонтрагент";
КонецЕсли;
Запрос.УстановитьПараметр("ссылкаТекущийКонтрагент", Источник);
Запрос.УстановитьПараметр("ИНН", ИНН);
Запрос.УстановитьПараметр("КПП", КПП);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ТекстСообщения = "ВНИМАНИЕ! Существуют контрагенты с таким же ИНН/КПП ("+ИНН+"/"+КПП+"):";
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ТекстСообщения = ТекстСообщения + Символы.ПС + Строка(ВыборкаДетальныеЗаписи.Код)+" "+ Строка(ВыборкаДетальныеЗаписи.Наименование);
КонецЦикла;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстСообщения;
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
2. в форме контрагента в процедуру перед записью добавляем:
Код 1C v 8.3 Процедура ПередЗаписью(Отказ)
мЭтоНовый = ЭтоНовый();
мИНН = Ссылка.ИНН;
Если ОбособленноеПодразделение И ЗначениеЗаполнено(ГоловнойКонтрагент) И ГоловнойКонтрагент <> Ссылка Тогда
ИНН = ГоловнойКонтрагент.ИНН;
КонецЕсли;
//all4cf проверка на дубли
all4cf.ЗапретДублированияКонтрагентовОбработкаПроверкиЗаполнения(ИНН, КПП, Ссылка, Отказ);
КонецПроцедуры // ПередЗаписью()
Результат:
Категория:
Полезные, Универсальные Функции Добавление дополнительных отчетов и обработок в тонком клиенте БП 3.0, ЗУП 3.0, УТ 11 Любой отчет и обработку можно подключить пользователям как дополнительные отчеты или обработки, вот например пункт в БП - Банк:
Добавление происходит через
далее Дополнительные отчеты и обработки , в списке нажмите Создать и Выберите Файл отчета/обработки:
Перед добавлением файл нужно подготовить, дописать в модуль объекта код подключения:
Для обработок код:
Код 1C v 8.3 Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
//Вид
//Строка, вид обработки, один из возможных:
//"ДополнительнаяОбработка", "ДополнительныйОтчет", "ЗаполнениеОбъекта", "Отчет", "ПечатнаяФорма", "СозданиеСвязанныхОбъектов"
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
//Массив строк имен объектов метаданных в формате:
//<ИмяКлассаОбъектаМетаданного>.[ * | <ИмяОбъектаМетаданных>].
//Например, "Документ.СчетЗаказ" или "Справочник.*".
//Прим. параметр имеет смысл только для назначаемых обработок, для глобальных может не задаваться.
ПараметрыРегистрации.Вставить("Назначение", Новый СписокЗначений);
//Наименование обработки, которым будет заполнено наименование элемента справочника по умолчанию - краткая строка для идентификации обработки администратором
ПараметрыРегистрации.Вставить("Наименование", "Сравнение документов БУХ и УТ");
//Версия обработки в формате “<старший номер>.<младший номер>” используется при загрузке обработок в информационную базу. Например “.
ПараметрыРегистрации.Вставить("Версия", "1.0");
//Принимает значение Истина или Ложь, в зависимости от того, требуется ли устанавливать или отключать безопасный режим исполнения обработок. Если истина, обработка будет запущена в безопасном режиме. Более подбробно о безопасном режиме в справке к платформе 1С:Предприятие.
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
//Краткая информация по обработке, описание обработки.
ПараметрыРегистрации.Вставить("Информация", "");
//Команды, поставляемые обработкой. Таблица значений с колонками:
ПараметрыРегистрации.Вставить("Команды", Новый СписокЗначений);
ТаблицаКоманд = ПолучитьТаблицу_Команд();
ДобавитьКоманду(ТаблицаКоманд,
"Сравнение документов БУХ и УТ", //Представление
"Сравнение документов БУХ и УТ", //Идентификатор
"ОткрытиеФормы", //Использование
Ложь, //ПоказыватьОповещение
""); //Модификатор
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицу_Команд()
Команды = Новый ТаблицаЗначений;
//Представление – представление команды в пользовательском интерфейсе;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
//Идентификатор – идентификатор команды;
//любая строка, уникальная в пределах данной обработки (отчета).
//В случае с обработка ми печатных форм на основе макета табличного документа передается список макетов,
//на основе которых нужно получить печатную форму
//(см. описание параметра ИменаМакетов процедуры УправлениеПечатьюКлиент.ВыполнитьКомандуПечати в разделе Печать).
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
//"ОткрытиеФормы" – открыть форму обработки;
//"ВызовКлиентскогоМетода" – вызвать клиентскую экспортную процедуру из модуля формы обработки;
//"ВызовСерверногоМетода" – вызвать серверную экспортную процедуру из модуля объекта обработки.
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
//ПоказыватьОповещение – если Истина, требуется показать оповещение при начале и при завершении работы обработки.
//Имеет смысл только при запуске обработки без открытия формы.
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
//Модификатор – дополнительный модификатор команды.
//Используется для дополнительных обработок печатных форм на основе табличных макетов,
//для таких команд должен содержать строку ПечатьMXL (см. пример в демонстрационной конфигурации).
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Для отчетов и печатных форм меняйте параметр Вид :
Код 1C v 8.3 //"ДополнительнаяОбработка", "ДополнительныйОтчет", "ЗаполнениеОбъекта", "Отчет", "ПечатнаяФорма", "СозданиеСвязанныхОбъектов"
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
Возможные значения этого поля приведу в виде таблицы
Значение поля "Вид" Расположение команды Расширение
файла
ПечатнаяФорма В меню "Печать" на форме объекта или списка epf ЗаполнениеОбъекта В меню "Заполнить" на форме объекта или списка epf СозданиеСвязанныхОбъектов В меню "Создать на основании" - "Создание связанных объектов.." на форме объекта или списка epf Отчет В меню "Отчеты" на форме объекта или списка erf ДополнительнаяОбработка В списке соответствующих подсистем в меню "Сервис" - "Дополнительные обработки" epf ДополнительныйОтчет В списке соответствующих подсистем в меню "Сервис" - "Дополнительные отчеты" erf
Это поле может принимать одно из значений, возвращаемых функциями в типовых конфигурациях:
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработки<Вид>(). Например, для вида "ПечатнаяФорма" есть функция ВидОбработкиПечатнаяФорма().
Категория:
Внешние печатные формы, отчеты и обработк… Как получить координаты выделенной области на Яндекс Карте? На одном проекте потребовалось получать координаты выделенной области на яндекс карте, после долгих изучений получилось следующее:
Вид Формы: На карте выделяете объект, нажимаете кнопку Получить координаты выделенной области и заполняется таблица координат
Код инициализации карты и обработчик кнопки получения координат:
Код 1C v 8.х Процедура ИнициализироватьКарту()
ПутьКФайлу = КаталогВременныхФайлов()+"yamaps.html";
Ф = новый Файл(ПутьКФайлу);
Если Ф.Существует() Тогда
УдалитьФайлы(ПутьКФайлу);
КонецЕсли;
Т = новый ТекстовыйДокумент;
ТД = ЭтотОбъект.ПолучитьМакет("МакетЯндекс");
Т.УстановитьТекст(ТД.ПолучитьТекст());
Т.Записать(ПутьКФайлу);
ЭлементыФормы.Эксплорер.Перейти(ПутьКФайлу);
КонецПроцедуры
Процедура ВыполнитьСкрипт(Команда) Экспорт
ЭлементыФормы.Эксплорер.document.getElementById("WebClientOperation").value = Команда;
ЭлементыФормы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
Процедура ПриОткрытии()
ИнициализироватьКарту();
КонецПроцедуры
Процедура ПолучитьКоординатыНажатие(Элемент)
ВыполнитьСкрипт("GetGEO();");
ТекКоординаты=ЭлементыФормы.Эксплорер.document.getElementById("geometry").innerText;
ТекКоординаты=СтрЗаменить(ТекКоординаты,"Координаты: [","");
МассивСтроки = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ТекКоординаты, "], [ ");
Точки.Очистить();
Для Каждого стр из МассивСтроки Цикл
Текстр=СтрЗаменить(стр,"[","");
Текстр=СтрЗаменить(Текстр,"]","");
Текстр=СокрЛП(Текстр);
нСтрок=Точки.Добавить();
симвЗапятой=Найти(Текстр,",");
нСтрок.Широта=Лев(Текстр,симвЗапятой-1);
нСтрок.Долгота=Сред(Текстр,симвЗапятой+2,СтрДлина(Текстр));
КонецЦикла;
//Сообщить(ТекКоординаты);
КонецПроцедуры
Макет
Код VBS <!DOCTYPE html">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0px; padding: 0px }
#map { height: 100% }
</style>
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
var index = 1;
var MyMap, route;
var clusterer;
var PointArray = [];
var noclick = false;
ymaps.ready(init);
function init(){
myMap = new ymaps.Map ("map", {
center: [55.75, 37.62],
zoom: 10
}),
polygon = new ymaps.GeoObject({
geometry: {
type: "Polygon",
coordinates: []
}
});
myMap.behaviors.enable('scrollZoom');
myMap.behaviors.disable('dblClickZoom');
myMap.events.add('click', function (e) {
if (!noclick) {
// addMarker(e.get('coords'));
}else{
noclick = false;
}
});
myMap.events.add('drag end', function (e) {
noclick = true;
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
});
// создадим кластеризатор и запретим приближать карту при клике на кластеры
//clusterer = new ymaps.Clusterer({clusterDisableClickZoom: true, synchAdd: true});
//myMap.geoObjects.add(clusterer);
myMap.geoObjects.add(polygon);
polygon.editor.startDrawing();
$('input').attr('disabled', false);
// Обработка нажатия на любую кнопку.
$('input').click(
function () {
// Отключаем кнопки, чтобы на карту нельзя было
// добавить более одного редактируемого объекта (чтобы в них не запутаться).
$('input').attr('disabled', true);
GetGEO();
});
}
function addMarker(coordPosition){
myPlacemark = new ymaps.Placemark(coordPosition, {
// Свойства
// Текст метки
iconContent: 'Точка'+index
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
document.getElementById('CoordX').value = coordPosition[0].toPrecision(15);
document.getElementById('CoordY').value = coordPosition[1].toPrecision(15);
index++;
}
function calcRoute(options){
ymaps.route(options, {
// Опции маршрутизатора
mapStateAutoApply: true, // автоматически позиционировать карту
avoidTrafficJams: false // Учитывать пробки
}).then(
function (router) {
route = router;
myMap.geoObjects.add(route);
//заполняем и сохраняем инфо про маршрут
document.getElementById('RouteInfo').value = "Длина маршрута - " + route.getHumanLength() + ". Время - " + route.getHumanJamsTime();
//генерация события для перехвата в 1С
var evt = document.createEventObject();
document.body.fireEvent('ondatasetcomplete', evt);
},
function (error) {
alert("Возникла ошибка: " + error.message);
});
}
function calcLine(options){
var poly = new ymaps.Polyline(options, {
hintContent: "Маршрут",
balloonContent: "Маршрут экспедитора",
balloonContentHeader: "",
balloonContentBody: "",
balloonContentFooter: ""
}, {
cursor: "pointer",
draggable: false,
hasBalloon: true,
hasHint: true,
interactiveZIndex: false,
opacity: 1,
openBalloonOnClick: true,
openEmptyBalloon: false,
openEmptyHint: false,
openHintOnHover: true,
strokeColor: '#E33926',
strokeOpacity: 0.8,
strokeStyle: '',
strokeWidth: 5,
syncOverlayInit: false,
visible: true
});
myMap.geoObjects.add(poly);
myMap.setBounds(poly.geometry.getBounds());
}
function Reset(){
// Удаляем все геообъекты на карте
myMap.geoObjects.removeAll();
PointArray = [];
index = 1;
}
function ChangeCityMSK(){
myMap.panTo([55.75, 37.62], {
flying: 1
});
}
function ChangeCitySPB(){
myMap.panTo([59.938531, 30.313497], {
flying: 1
});
}
function ChangeCityKRAS(){
myMap.panTo([45.04, 38.97], {
flying: 1
});
}
function ChangePlace(k,d){
myMap.panTo([k, d], {
flying: 1
});
}
function FindAdres(Adres){
Reset();
var myGeocoder = ymaps.geocode(Adres);
myGeocoder.then(
function (res){
var firstGeoObject = res.geoObjects.get(0);
if(firstGeoObject != null){
myMap.panTo(
// Координаты нового центра карты
firstGeoObject.geometry.getCoordinates(), {
/* Опции перемещения:
разрешить уменьшать и затем увеличивать зум
карты при перемещении между точками
*/
flying: true
}
);
myPlacemark = new ymaps.Placemark(firstGeoObject.geometry.getCoordinates(), {
// Свойства
// Текст метки
iconContent: Adres
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
}else{
alert("Ничего не найдено");}
}
);
}
function ReverseSearchAdres(CoordX, CoordY, Adres){
Reset();
var CoordPosition = [CoordX, CoordY];
myMap.panTo(
// Координаты нового центра карты
CoordPosition, {
/* Опции перемещения:
разрешить уменьшать и затем увеличивать зум
карты при перемещении между точками
*/
flying: true
}
);
myPlacemark = new ymaps.Placemark(CoordPosition, {
// Свойства
// Текст метки
iconContent: Adres
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
}
function addToPointArrayM(CoordX, CoordY, TextC, Text){
var CoordPosition = [CoordX, CoordY];
myPlacemark = new ymaps.Placemark(CoordPosition, {
// Свойства
// Текст метки
iconContent: Text
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: TextC
});
myMap.geoObjects.add(myPlacemark);
}
function addToPointArrayPointOne(CoordX, CoordY, ID, Text){
var point = new ymaps.GeoObject({
geometry: {type: "Point", coordinates: [CoordX, CoordY>,
properties: {
clusterCaption: ID,
iconContent: ID,
hintContent: ID,
balloonContent: Text,
balloonContentBody: Text
}
});
myMap.geoObjects.add(point);
}
function addToPointArray(CoordX, CoordY, ID, Text){
var point = new ymaps.GeoObject({
geometry: {type: "Point", coordinates: [CoordX, CoordY>,
properties: {
clusterCaption: ID,
iconContent: ID,
hintContent: ID,
balloonContent: Text,
balloonContentBody: Text
}
});
PointArray.push(point);
}
function drawCluster(){
clusterer.add(PointArray);
myMap.geoObjects.add(clusterer);
}
function createPolygon(ArrayPoint, Name, color) {
// Создаем многоугольник
myPolygon = new ymaps.Polygon([
// Координаты вершин внешней границы многоугольника.
ArrayPoint
], {
//Свойства
hintContent: Name
}, {
// Опции.
// Цвет заливки (зеленый)
fillColor: color,
// Цвет границ (синий)
strokeColor: '#0000FF',
// Прозрачность (полупрозрачная заливка)
opacity: 0.6,
// Ширина линии
strokeWidth: 5,
// Стиль линии
strokeStyle: 'shortdash'
});
myMap.geoObjects.add(myPolygon);
}
function WebClientClick() {
//очистка перед кликом координат, иначе после клика в упр. формах идет считывание координат
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
var WebClientOperation = document.getElementById("WebClientOperation").value;
//alert(WebClientOperation);
switch (WebClientOperation) {
case "0": // ничего не делаем
var a = 1;
default: // запускаем функцию
eval(WebClientOperation);
}
document.getElementById('WebClientOperation').value = "0";
}
function GetGEO(){
polygon.editor.stopEditing();
printGeometry(polygon.geometry.getCoordinates());
}
// Выводит массив координат геообъекта в <div id="geometry">
function printGeometry (coords) {
$('#geometry').html('Координаты: ' + stringify(coords));
function stringify (coords) {
var res = '';
if ($.isArray(coords)) {
res = '[ ';
for (var i = 0, l = coords.length; i < l; i++) {
if (i > 0) {
res += ', ';
}
res += stringify(coords[i]);
}
res += ' ]';
} else if (typeof coords == 'number') {
res = coords.toPrecision(6);
} else if (coords.toString) {
res = coords.toString();
}
return res;
}
}
</script>
</head>
<body>
<div id="geometry"/></div>
<div id="map" style="width:100%; height:100%"></div>
<input type="hidden" id="CoordX" name="CoordX" value="0"></input>
<input type="hidden" id="CoordY" name="CoordY" value="0"></input>
<input type="hidden" id="RouteInfo" name="RouteInfo" value=""></input>
<input type="hidden" id="WebClientOperation" name="WebClientOperation" value="0"></input>
<input type="hidden" id="WebClient" name="WebClient" onclick="WebClientClick();"></input>
<!-- <input type="button" value="Завершить редактирование" id="stopEditPolyline"/> -->
</body>
</html>
Категория:
Географическая схема Отключение предупреждения безопасности в платформе 8.3.9 В версии 8.3.9.2170 была усилена безопасность - теперь система запрашивает подтверждение на запуск внешних обработок, расширений и прочее. Видимо после трояна: Внимание! Первый троян для 1С -запускающий шифровальщика-вымогателя
Реализован механизм защиты от опасных действий. При выполнении потенциально опасного действия система выдает предупреждение, содержащее информацию о выполняемом действии и потенциальной опасности этого действия. К потенциально опасным действиям относятся:
Загрузка внешнего отчета, обработки или расширения конфигурации. Загрузка или обновление конфигурации/расширения. Доступ из внешнего отчета/обработки или расширения к следующим возможностям: Исполнение команды операционной системы. Управление пользователями. Загрузка внешней компоненты. Пользователь имеет возможность разрешить или отклонить потенциально опасное действие. Если действие разрешено, в ряде случаев может потребоваться повторно выполнить разрешенное действие.
Сообщение выглядит так:
Предупреждение безопасности
Открывается "" из файла " C:\.......epf". Рекомендуется обращать внимание на источник, из которого был получен данный файл. Если с источником нет договоренности о разработке дополнительных модулей, или есть сомнения в содержимом файла, то его не рекомендуется открывать, поскольку это может нанести вред компьютеру и данным. Разрешить открывать данный файл. ДА, НЕТ
Решение:
В конфигураторе в свойствах пользователя ИБ убрать флажок "Защита от опасных действий".
Из документации: Отключение механизма защиты от опасных действий
В ряде случае необходимо отключить механизм защиты от опасных действий. Для этого можно воспользоваться следующими возможностями:
1. Выключить флажок Защита от опасных действий (ЗащитаОтОпасныхДействий) в свойствах конкретного пользователя. Это отключит защиту для этого пользователя.
2. Воспользоваться параметром ЗащитаОтОпасныхДействий методов Подключить() менеджеров внешних обработок (отчетов). В этом случае имеется возможность загрузить внешнюю обработку (отчет) без запросов пользователя.
3. Воспользоваться свойством ЗащитаОтОпасныхДействий объекта РасширениеКонфигурации перед вызовом метода Записать() этого объекта.
4. Воспользоваться параметром DisableUnsafeActionProtection файла conf.cfg. В этом случае механизм защиты от опасных действий будет отключаться для всех пользователей информационных баз, строки соединения которых удовлетворяют указанным маскам.
Отключение защиты от опасных действий выполняется по следующим правилам (в указанном порядке):
1. Защита считается отключенной, если у текущего пользователя сброшен флажок Защита от опасных действий.
2. Защита считается отключенной, если строка соединения с информационной базой удовлетворяет одному из шаблонов, указанных в параметре DisableUnsafeActionProtection файла conf.cfg.
3. Если внешняя обработка (отчет) подключается с явным образом отключенной защитой с помощью параметра ЗащитаОтОпасныхДействий.
4. Если защита явным образом отключена с помощью свойства расширения ЗащитаОтОпасныхДействий.
Категория:
Администрирование Добавление дополнительных отчетов и обработок в управляемом приложении Для добавления отчета или обработки нужно в модуле добавить Функцию СведенияОВнешнейОбработке()
Код 1C v 8.2 УП Функция СведенияОВнешнейОбработке() Экспорт
// Объявим переменную, в которой мы сохраним и вернем "наружу" необходимые данные
ПараметрыРегистрации = Новый Структура;
// Объявим еще одну переменную, которая нам потребуется ниже
МассивНазначений = Новый Массив;
// Первый параметр, который мы должны указать - это какой вид обработки системе должна зарегистрировать.
// Допустимые типы: ДополнительнаяОбработка, ДополнительныйОтчет, ЗаполнениеОбъекта, Отчет, ПечатнаяФорма, СозданиеСвязанныхОбъектов
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
// Теперь зададим имя, под которым ВПФ будет зарегистрирована в справочнике внешних обработок
ПараметрыРегистрации.Вставить("Наименование", "Выгрузка проводок в БП 2.0");
// Зададим право обработке на использование безопасного режима. Более подробно можно узнать в справке к платформе (метод УстановитьБезопасныйРежим)
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
// Следующие два параметра играют больше информационную роль, т.е. это то, что будет видеть пользователь в информации к обработке
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("Информация", "Обработка 'Выгрузка проводок в БП 2.0'");
// Создадим таблицу команд (подробнее смотрим ниже)
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
"Выгрузка проводок в БП 2.0",
"ВыгрузкапроводоквБП20",
"ОткрытиеФормы", //Использование. Варианты: "ОткрытиеФормы", "ВызовКлиентскогоМетода", "ВызовСерверногоМетода"
Ложь,//Показывать оповещение. Варианты Истина, Ложь
"");//Модификатор
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
После сохранения приступим к добавлению в программу:
Ставим галку Дополнительные отчеты и обработки
Открываем дополнительные отчеты и обработки и жмем создать, появляется окно выбора файла, после выбора:
Укажите Размещение (в каком разделе отображать данный отчет/обработку) и в списке в колонке Быстрый доступ выберите пользователей, которым будет доступен данный отчет/обработка .
Если при добавлении вы получаете ошибку:
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(2621)}: Поле объекта не обнаружено (ХранилищеВариантов)
Если ВнешнийОбъектМетаданные.ХранилищеВариантов <> Неопределено Тогда
То нужно заменить в модуле объекта, в ф ункции СведенияОВнешнейОбработке() :
Код 1C v 8.2 УП РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОтчет"); //расширение erf
на:
РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОбработка"); //расширение epf
Категория:
Внешние печатные формы, отчеты и обработк… Как в СКД вывести дату и время формирования отчета? Есть несколько вариантов вывода информации перед основным отчетом,какой лучше?! - зависит от задачи:
Допустим нам нужно вывести дату и время формирования отчета и свою шапку отчета, например так:
Варианты решения:
1. Использование группировки и макета заголовка: 1. Создаем в схеме новую группировку (без поля) и установим имя группировке Шапка отчета.
2. Удалим у данной группировки из выбранных полей автополе
В других настройках выберем макет оформления "Без оформления" (иначе на наш макет будет накладываться стандартный макет и вокруг всех ячеек будет рамка)
На вкладке макеты добавляем макет заголовка группировки (при добавлении указываем наше имя группировки (Шапка отчета) и указываем область с нашими данными), справа в табличном документе пишем необходимый текст и параметр
Сохраняем, формируем и видим результат как выше
2. Программное изменение текста заголовка Код нужно установить в процедуре модуля отчета ПриКомпоновкеРезультата()
Код 1C v 8.2 УП ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.
НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Title"));
ЗначениеПараметра.Значение="Отчет сформирован "+Формат(ТекущаяДата(),"ДЛФ=DDT");
ЗначениеПараметра.Использование = Истина;
еще пример:
Код 1C v 8.3 Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("ВыводитьЗаголовок").Использование = Истина;
КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("ВыводитьЗаголовок").Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить;
КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("Заголовок").Использование = Истина;
КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("Заголовок").Значение = "Пример вывода своего заголовка," + Символы.ПС
+ "Отчет сформирован "+Формат(ТекущаяДата(),"ДЛФ=DDT");
КонецПроцедуры
3. Вывод табличного макета с параметром перед формированием отчета Создаем макет ВыводСформирован , в нем создаем параметр Сформирован и назначаем имя области Заголовок
В модуле перед
Код 1C v 8.х МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
Пишем:
Код 1C v 8.х // получим макет заголовка отчета
МакетЗаголовка = ПолучитьМакет("ВыводСформирован");
ОбластьЗаголовка = МакетЗаголовка.ПолучитьОбласть("Заголовок");
ОбластьЗаголовка.Параметры.Сформирован = "Сформирован: " + Формат(ТекущаяДата(),"ДЛФ=DDT");
//ОбластьЗаголовка.Параметры.Заголовок = ТекстЗаголовка;
ТабличныйДокумент.Вывести(ОбластьЗаголовка);
в результате:
Категория:
Схема Компоновки Данных Как очистить справочник удалив все не используемые элементы? Очень часто менеджеры дублируют информацию в справочниках и время от времени их приходится чистить.
Но как удалить только те элементы справочника, которые не используются в документах?
Следующий пример кода поможет это сделать(в примере обрабатывается 4 справочника: Сотрудники, ФизЛица, Договора и Контрагенты) Скачать: Обработка для УТ 10 :
Код 1C v 8.х сп=Новый СписокЗначений;
сп.Добавить("СотрудникиОрганизаций");
сп.Добавить("ФизическиеЛица");
сп.Добавить("ДоговорыКонтрагентов");
сп.Добавить("Контрагенты");
Для Каждого стр из сп Цикл
текСпр=стр.Значение;
Запрос = Новый Запрос;
Текст =
"ВЫБРАТЬ
| СотрудникиОрганизаций.Ссылка
|ИЗ
| Справочник.%текСпр% КАК СотрудникиОрганизаций
|ГДЕ
| НЕ СотрудникиОрганизаций.ПометкаУдаления И НЕ СотрудникиОрганизаций.ЭтоГруппа";
Запрос.Текст = СтрЗаменить(Текст,"%текСпр%",текСпр);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
итЗаписей = Строка(ВыборкаДетальныеЗаписи.Количество());
ном=0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ном=ном+1; Состояние(текСпр+": "+Строка(ном)+" из "+итЗаписей);
СсылкаНаУдаляемыйЭлемент = ВыборкаДетальныеЗаписи.Ссылка;
// Найти ссылки на удаляемый элемент - СсылкаНаУдаляемыйЭлемент.
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаУдаляемыйЭлемент);
НайденныеСсылки = НайтиПоСсылкам(МассивСсылок);
Если НайденныеСсылки.Количество() > 0 Тогда
Сообщить("Нельзя удалять элемент:"+Строка(СсылкаНаУдаляемыйЭлемент)+", на него имеются ссылки",СтатусСообщения.Внимание);
Иначе
Сообщить("Удаляем элемент:"+Строка(СсылкаНаУдаляемыйЭлемент),СтатусСообщения.Информация);
// Получаем объект
УдаляемыйЭлемент = СсылкаНаУдаляемыйЭлемент.ПолучитьОбъект();
// Установить пометку
//УдаляемыйЭлемент.УстановитьПометкуУдаления(Истина);
// Удалить сразу
УдаляемыйЭлемент.Удалить();
КонецЕсли;
КонецЦикла;
КонецЦикла;
Категория:
Справочники Как выгрузить все дополнительные обработки и отчеты в каталог? Выгрузить все дополнительные обработки и отчеты в каталог всего за пару кликов. Простейшая обработка в один реквизит и команду.
Набросайте элементы на форму и вставьте код в модуль формы обработки. И без всякого скачивания.
Работоспособность проверена на БП 3.0, Документооборот 1.4-2.0, платформы 1С 8.3.7, 8.3.8
Код 1C v 8.3 #Область ВыборКаталогаДляВыгрузки
// процедура вешается на событие начало выбора у реквизита КаталогВыгрузки.
// Чтобы при нажатии на кнопку выбора открылась форма выбора каталога файловой системы.
&НаКлиенте
Процедура КаталогВыгрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
//открываем диалог выбора файла
ДопПараметры = новый Структура;
ДопПараметры.Вставить("ИмяЭлемента","КаталогВыгрузки");
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьВыборКаталога", ЭтаФорма,ДопПараметры);
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
Если ЗначениеЗаполнено(Объект.КаталогВыгрузки) Тогда
ДиалогОткрытияФайла.Каталог = Объект.КаталогВыгрузки;
КонецЕсли;
ДиалогОткрытияФайла.Показать(ОписаниеОповещения);
КонецПроцедуры
// окончание выбора каталога
&НаКлиенте
Процедура ОбработатьВыборКаталога(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;
Объект[ДополнительныеПараметры.ИмяЭлемента] = ВыбранныеФайлы[0];
КонецПроцедуры
#КонецОбласти
#Область НажатиеНаКнопку
// кнопка начала выгрузки
&НаКлиенте
Процедура Выгрузить(Команда)
ОчиститьСообщения();
// проверка на заполнение реквизита, существовавание каталога, на его "не пустоту"
Если НЕ ЗначениеЗаполнено(Объект.КаталогВыгрузки) Тогда
Сообщить("Укажите каталог для выгрузки");
Возврат;
КонецЕсли;
Каталог = Новый Файл(Объект.КаталогВыгрузки);
Если НЕ Каталог.Существует() Тогда
Сообщить("Указанный каталог не существует");
Возврат;
КонецЕсли;
МассивФайлов = НайтиФайлы(Объект.КаталогВыгрузки,"*.*");
Если МассивФайлов.Количество()>0 Тогда
ОписаниеОповещения = новый ОписаниеОповещения("ПодвержденияЗамещения",ЭтаФорма);
ПоказатьВопрос(ОписаниеОповещения,"В каталоге есть файлы. При выгрузке будет выполнение замещение существующих."+Символы.ПС+"Начать выгрузку?",РежимДиалогаВопрос.ДаНет);
Возврат;
КонецЕсли;
ВыгрузкаНачнись(); // проблем не обнаружили, давайте выгружать уже
КонецПроцедуры
// если пользователь передумал затирать файлы в каталоге, выгрузку делать не будем
&НаКлиенте
Процедура ПодвержденияЗамещения(ЧтоОтветилПользователь, Параметры) Экспорт
Если ЧтоОтветилПользователь = КодВозвратаДиалога.Да Тогда
ВыгрузкаНачнись();
Иначе
Возврат;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СамаВыгрузка
&НаКлиенте
Процедура ВыгрузкаНачнись()
ПолучаемыеФайлы = ПодготовимФайлыНаСервере(ЭтаФорма.УникальныйИдентификатор);
Обработчик = Новый ОписаниеОповещения("ОбработкаРезультатаВыгрузки", ЭтотОбъект);
НачатьПолучениеФайлов(Обработчик, ПолучаемыеФайлы, Объект.КаталогВыгрузки, Ложь);
КонецПроцедуры
&НаСервере
Функция ПодготовимФайлыНаСервере(ИдентификаторФормы)
Массив = Новый Массив;
Выборка = Справочники.ДополнительныеОтчетыИОбработки.Выбрать(); // выберем все в справочнике.
Пока Выборка.Следующий() Цикл
Если ТипЗнч(Выборка.ХранилищеОбработки) = Тип("ХранилищеЗначения") Тогда
Адрес = ПоместитьВоВременноеХранилище(Выборка.ХранилищеОбработки.Получить(),ИдентификаторФормы);
Массив.Добавить(Новый ОписаниеПередаваемогоФайла(Выборка.ИмяФайла, Адрес));
КонецЕсли;
КонецЦикла;
Возврат Массив;
КонецФункции
&НаКлиенте
Процедура ОбработкаРезультатаВыгрузки(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
ПоказатьПредупреждение(,"Выгрузка в каталог завершена",10); // все готово, шеф!
КонецПроцедуры
#КонецОбласти
Автор: Михали Задорнов (MZadornov)
Категория:
Внешние печатные формы, отчеты и обработк… Последовательность событий при открытии формы нового элемента Последовательность событий, которые происходят при открытии формы нового элемента, можно представить следующей схемой:
Прежде всего, при заполнении нового объекта данными, можно попробовать обойтись вообще без написания какого-либо кода. Для этого у реквизитов объектов конфигурации есть свойства ЗначениеЗаполнения и ЗаполнятьИзДанныхЗаполнения.
Эти свойства позволяют визуально (в конфигураторе) задать правила, по которым реквизит будет заполняться данными при создании нового объекта.
Если этих возможностей недостаточно, то тогда нужно использовать возможности встроенного языка.
Действия с данными объекта нужно выполнять в модуле объекта, в обработчике события ОбработкаЗаполнения. Этот событие возникает только при создании новых объектов, при открытии форм существующих объектов это событие не вызывается. Поэтому в нем не нужно узнавать, новый это объект, или нет. Нужно только описать алгоритм заполнения объекта данными. При этом следует учитывать, что это событие будет вызываться в нескольких случаях:
при интерактивном создании нового объекта, при вводе на основании, при выполнении метода объекта Заполнить (). При этом параметр Основание, передаваемый в этот обработчик, может иметь различные значения в зависимости от того, каким образом создается новый элемент.
Например, он может иметь тип ссылки, если новый объект вводится на основании.
Или он может иметь тип Структура, если новый объект создается интерактивной командой из списка, в котором установлен отбор. В этом случае структура будет содержать значения элементов отбора этого списка.
Также этот параметр может иметь тип Неопределено, если новый элемент создается интерактивной командой из панели действий. То есть в своем алгоритме начального заполнения полезно анализировать этот параметр.
Что касается внешнего вида формы нового объекта, то им нужно управлять в обработчике события формы ПриСозданииНаСервере.
Это событие возникает и для новых, и для существующих объектов. Поэтому в нем нужно убедиться в том, что открывается форма именно нового объекта. Убедиться в этом можно проанализировав параметр формы Ключ.
Если объект новый, в этом параметре будет пустая ссылка. Если это существующий объект – в этом параметре будет ссылка на этот объект:
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Ключ.Пустой() Тогда //ЭтоНовый
КонецЕсли;
КонецПроцедуры
Если требуется выполнять какие-то действия в обработчике события формы ПриОткрытии , то в нем ситуация аналогичная, нужно анализировать параметр формы Ключ.
Для тех кто не хочет читать все что выше, код проверки на ЭтоНовый в Управляемом приложении:
Код 1C v 8.3 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Ключ.Пустой() Тогда //ЭтоНовый
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
//1С советует и тут использовать Параметры.Ключ.Пустой()
// но можно и так:
Если Объект.Ссылка.Пустая() Тогда //ЭтоНовый
//
КонецЕсли;
КонецПроцедуры
Категория:
Управляемое приложение, Тонкий клиент Регистрация компоненты comcntr.dll (для COM соединения с базой 1С) Если фоновый процесс COM-соединения завершается с ошибкой:
{Обработка.ОбменДаннымиXML.МодульОбъекта(15947)}: Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Invalid class string
Нужно зарегистрировать библиотеку ComConnector comcntr.dll из каталога программы.
!!! Перед этим нужно отключить службу агента сервера 1С:Предприятия и все программы, использующие эту DLL !!!
В 32-битной версии сервера проблема решилась бы командой: regsvr32 «C:\Program Files (x86)\1cv8\8.3.5.1119\bin\comcntr.dll»
но в 64-битной версии команда будет примерно такой * : C:\Windows\SysWOW64\regsvr32 «C:\Program Files (x86)\1cv8\8.3.5.1119\bin\comcntr.dll»
При удачном выполнении Вы увидите:
Если команда регистрации не помогла, то нужно предварительно удалить регистрацию библиотеки comcntr.dll, запустив ту же команду вызова regsvr32 с ключом /u
Если и это не помогло, попробуйте переустановить платформу 1С в режиме Исправить и отметьте COM соединение
Категория:
Администрирование Добавить штрихкод Здравствуйте! Такой вопрос: Как в Отчет с помощью построительОтчета засунуть штрихкод?!
ПолучитьМакетПостротеляОтчета() вот из за него начинаются проблемы. Выдаёт только КоличествоНачальныйОстаток и КоличествоКонечныйОстаток. Я так понял в отчет выводится первая картинка тогда как мне надо третью.
ШТРИХКОД ДОБАВЛЯЮ ТАК
Код 1C v 8.3 ТЗ = ПостроительОтчета.Результат.Выгрузить();
ТЗ.Колонки.Добавить("Штрихкод",,"Штрихкод");
ПакетДляОтчета = ТЗ;
ОбработкаШК = ВыбираемШК(ТЗ);
ПомещаемШКВПакет(ОбработкаШК);
ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ПакетДляОтчета);
ОтборПериодичность = ДобавитьОтборПериодичность();
ПостроительОтчета.Макет = ПолучитьМакетПостротеляОтчета();
ПостроительОтчета.МакетОформления = _ПолучитьМакетОформления();
ПостроительОтчета.ОформитьМакет();
ПостроительОтчета.Параметры.Вставить("ДатаНач", ?(ДатаНач = Дата('00010101000000'), ДатаНач, Новый Граница(НачалоДня(ДатаНач), ВидГраницы.Включая)));
ПостроительОтчета.Параметры.Вставить("ДатаКон", ?(ДатаКон = Дата('00010101000000'), ДатаКон, Новый Граница(КонецДня(ДатаКон), ВидГраницы.Включая)));
ПостроительОтчета.Параметры.Вставить("ДатаНачала", ?(ДатаНач = Дата('00010101000000'), ДатаНач, НачалоДня(ДатаНач)));
ПостроительОтчета.Параметры.Вставить("ДатаКонца", ?(ДатаКон = Дата('00010101000000'), Дата("39991231"), КонецДня(ДатаКон)));
ПостроительОтчета.Выполнить();
ПостроительОтчета.Вывести(ТабличныйДокумент);
<br>
Категория:
1С Управление производственным предприят…