=======================================================================
== Строку перевести на латиницу
=======================================================================
--развернуть-->
СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(Строка);
=======================================================================
== Добавить свою подсистему в информационную базу 1С
=======================================================================
--развернуть-->
1. Создать свою подсистему в конфигураторе.
2. На закладке "Основные" поставить галочку "Включить в коммандный интерфейс".
3. Настроить порядок расположения вывода подсистемы на панеле подсистем. Для этого необходимо нажать правой клавишей мышки по конфигурации и выбрать пункт "Открыть командный интерфейс конфигурации".
4. Добавить общие комманды для подключения внешних отчетов и обработок:
"ВашаПодсистема_ПанельОтчетовРасчетчик"
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ВариантыОтчетовКлиент.ПоказатьПанельОтчетов("ВашаПодсистема", ПараметрыВыполненияКоманды);
КонецПроцедуры
"ВашаПодсистема_ДополнительныеОбработки"
#Область ОбработчикиСобытий
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ДополнительныеОтчетыИОбработкиКлиент.ОткрытьФормуКомандДополнительныхОтчетовИОбработок(
ПараметрКоманды,
ПараметрыВыполненияКоманды,
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(),
"ВашаПодсистема");
КонецПроцедуры
#КонецОбласти
5. Добавить Роли (на подсистему и команды).
6. Добавить в "ВариантыОтчетовУТПереопределяемый" следующий код:
Процедура ОпределитьРазделыСВариантамиОтчетов(Разделы) Экспорт
...
Разделы.Добавить(Метаданные.Подсистемы.Найти("ВашаПодсистема"),
НСтр("ru= 'Отчеты ВашейПодсистемы'"));
КонецПроцедуры
7. Добавить в "ДополнительныеОтчетыИОбработкиПереопределяемый" следующий код:
Процедура ОпределитьРазделыСДополнительнымиОбработками(Разделы) Экспорт
...
Разделы.Добавить(Метаданные.Подсистемы.ВашаПодсистема);
КонецПроцедуры
8. Добавить в подсистему необходимые объекты конфигурации.
9. Запустить применение изменений в базе с обновлением информационной базы.
=======================================================================
== Открыть форму элемента ячейки таблицы со сво-ом "ТолькоПросмотр"
=======================================================================
--развернуть-->
&НаКлиенте
Процедура ПриАктивизацииЯчейки(Элемент)
ИмяКолонки = Элементы.ИмяЭлемента.ТекущийЭлемент.Имя;
ИмяКолонки = СтрЗаменить(ИмяКолонки, "ИмяЭлемента", "");
ЗначениеАктивнойЯчейки = Элементы.ИмяЭлемента.ТекущиеДанные[ИмяКолонки];
Сообщить("ЗначениеАктивнойЯчейки:"+ЗначениеАктивнойЯчейки+"; Тип:"+ТипЗнч(ЗначениеАктивнойЯчейки));
Если ТипЗнч(ЗначениеАктивнойЯчейки)=Тип("СправочникСсылка.ИмяСправочника") Тогда
ПараметрыФормы = Новый Структура("Ключ",ЗначениеАктивнойЯчейки);
ОткрытьФорму("Справочник.ИмяСправочника.ФормаОбъекта",ПараметрыФормы,ЭтаФорма);
КонецЕсли;
КонецПроцедуры
Где:
ИмяЭлемента - Имя табличного элемента формы
ИмяСправочника - Имя справочника или иного объекта метаданных форму которого необходимо открыть
=======================================================================
== КД 2.0
=======================================================================
--развернуть-->
Если снята галка "поиск по уникальному идентификатору", то поиск вовсе не идет, а просто создается новый объект. Если же обмен идет с использованием типового плана обмена, то поиск ведется в соответствии с регистром сведений "СоответствияОбъектовИнформационныхБаз" (опять-таки, если база типовая), где объекту текущей базы сопоставлен УИД базы, с которой происходит обмен. Можно попробовать вернуть галку поиска по идентификатору, установить галку "Продолжить поиск по полям поиска...", а в ПКО в событии "Поля поиска" жестко прописать поиск объекта, например:
СсылкаНаОбъект = Справочники.Номенклатура.НайтиПоНаименованию(СвойстваПоиска.Получить("Наименование")).Ссылка;
=======================================================================
== MS SQL Server
=======================================================================
--развернуть-->
После установки и конфигурирования MS SQL, на файлы БД применяются разешения, где помимо всего прочего присутствует имя экземпляра MS SQL - MSSQLSERVICE (по умолчанию), при попытке добавить аналогичную учетную запись над ругие БД выдается ошибка сообщающая о том, что учетная запись не существует…
Решение:
При добавлении учетной записи необходимо указывать ее как сервис, заглавными буквами:
NT SERVICE\MSSQLSERVER
-------------------------------
== Сброс паролей пользователей
-------------------------------
Теперь попробуем заставить платформу думать что в базе нет ни одного пользователя. Для этого необходимо всего навсего переименовать таблицу v8users и строчку с файлом users.usr. Открываем SQL Server Management Studio логинимся и создаем запрос к базе данных с содержанием:
Код SQL
EXEC sp_rename 'v8users', 'v8users_old'
GO
UPDATE Params
SET FileName = 'users.usr_old'
WHERE FileName = 'users.usr'
GO
После этого открываем базу данных в конфигураторе и видим что платформа не спрашивает пользователя и пароль, при этом в SQL Server будет заново создана таблица v8users. Теперь чтобы всех пользователей вернуть обратно не закрывая конфигуратора выполним в SQL Server Management Studio запрос (После выполнения запроса в списке пользователей появяться все пользователи 1С, останеться только найти нужного и изменить ему пароль.):
Код SQL
DROP TABLE v8users
GO
EXEC sp_rename 'v8users_old', 'v8users'
GO
UPDATE Params
SET FileName = 'users.usr'
WHERE FileName = 'users.usr_old'
GO
-------------------------------
PS: Для PostgreSQL открываем pgAdminIII и выполняем:
Код SQL
ALTER TABLE v8users RENAME TO v8users_old;
UPDATE Params SET FileName = 'users.usr_old' WHERE FileName = 'users.usr';
заходим в конфигуратор и выполняем:
Код SQL
DROP TABLE v8users;
ALTER TABLE v8users_old RENAME TO v8users;
UPDATE Params SET FileName = 'users.usr' WHERE FileName = 'users.usr_old';
-------------------------------
Для файловой базы:
1.В HEX-редакторе нужно открыть файл базы с именем 1Cv8.1CD
2.Найти "users.usr" и переименовать на "lsers.usr".
3.Найти "v8users" и переименовать на "l8users".
4.Сохранить изменения.
=======================================================================
== Таблица значений в XML файл и обратно (Управляемые формы)
=======================================================================
--развернуть-->
&НаСервере
Функция ПроизвестиЗаписьТаблицыВXMLСервер()
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ТаблицаСооответсвияУслугНоменклатуре.Выгрузить());
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
Возврат ЗаписьXML.Закрыть();
КонецФункции
&НаСервере
Функция ПроизвестиЧтениеТаблицыИзXMLСервер(СтрокаXML)
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXML);
ТипОбъектаXDTO = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core","ValueTable");
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОбъектаXDTO);
ОбъектXDTO.Проверить();
ЧтениеXML.Закрыть();
ТаблицаСооответсвияУслугНоменклатуре.Загрузить(СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO));
КонецФункции
&НаКлиенте
Процедура СохранитьНастройкиТаблицыСоответствия(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.МножественныйВыбор = Ложь;
Диалог.Фильтр = "Текст(*.XML)|*.XML";
Если Диалог.Выбрать() Тогда
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.ДобавитьСтроку(ПроизвестиЗаписьТаблицыВXMLСервер());
ТекстовыйДокумент.Записать(Диалог.ПолноеИмяФайла);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьНастройкиТаблицыСоответствия(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.МножественныйВыбор = Ложь;
Диалог.ПроверятьСуществованиеФайла = Истина;
Диалог.Фильтр = "Текст(*.XML)|*.XML";
Если Диалог.Выбрать() Тогда
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(Диалог.ПолноеИмяФайла);
ПроизвестиЧтениеТаблицыИзXMLСервер(ТекстовыйДокумент.ПолучитьТекст());
КонецЕсли;
КонецПроцедуры
=======================================================================
== Получить Дату из Текстовой строки
=======================================================================
--развернуть-->
Функция ПолучитьДатуИзСтроки(ДатаТекст)
Год = Прав(ДатаТекст,4);
Месяц = Лев(Прав(ДатаТекст,7),2);
Число = Лев(ДатаТекст,2);
Возврат Дата(Строка(Год+Месяц+Число));
КонецФункции
=======================================================================
== Включить отладку на сервере 1С
=======================================================================
--развернуть-->
Отладка на сервере для платформы 1С 8.1
---
Чтобы точки останова отрабатывали в серверных процедурах, необходимо:
Остановить службу 1C Enterprise Server Agent.
Запустить редактор системного реестра. Чтобы открыть редактор реестра, необходимо нажать Windows + R (или Пуск-Выполнить) и ввести в командную строку regedit.
Найти ветку реестра [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.1 Server Agent].
Скорректировать атрибут «ImagePath»= , добавив «-debug».
Запустить службу 1C Enterprise Server Agent.
Пример:
До включения:
«C:\Program Files\1cv81\bin\ragent.exe» -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d «C:\Program Files\1cv81\server»
После включения отладки:
«C:\Program Files\1cv81\bin\ragent.exe» -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -debug -d «C:\Program Files\1cv81\server»
---
Если не работает отладка в 1С 8.2 и 8.3
---
Остановить службу 1C:Enterprise 8.2 Server Agent.
Запустить редактор системного реестра. Чтобы открыть редактор реестра, необходимо нажать Windows + R (или Пуск-Выполнить) и ввести в командную строку regedit.
Найти ветку реестра [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\1C:Enterprise 8.2 Server Agent\].
Находим свойство «ImagePath»= , добавляем в строку «-debug».
Записываем и запускаем службу.
Пример:
До включения:
«C:\Program Files (x86)\1cv82\8.2.18.109\bin\ragent.exe» -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d «C:\Program Files (x86)\1cv82\srvinfo»
После включения отладки:
«C:\Program Files (x86)\1cv82\8.2.18.109\bin\ragent.exe» -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d «C:\Program Files (x86)\1cv82\srvinfo» -debug»
=======================================================================
== Разбить ПериодОтчета на ВременныеОтрезки
=======================================================================
--развернуть-->
Условное оформление (Настройки отчета)
--
ДЕНЬ
Формат: ДЛФ=DD
--
МЕСЯЦ
Формат: ДФ='ММММ гггг'
--
КВАРТАЛ
Формат: ДФ='к"" КВАРТАЛ ""гггг'
--
ГОД
Формат: ДФ='гггг"" ГОД""'
--
НЕДЕЛЯ
СКД.ВычисляемоеПоле.Выражение:
ВЫБОР КОГДА &Отрезок="НЕДЕЛЯ" ТОГДА
ПОДСТРОКА(НЕДЕЛЯ(ДатаРегистратора), 1, 2) + ПОДСТРОКА(" НЕДЕЛЯ ", 1, 8) + ПОДСТРОКА(ГОД(ДатаРегистратора), 4, 2)
ИНАЧЕ ДатаРегистратора КОНЕЦ
=======================================================================
== Присоединенные файлы к самодельному справочнику
=======================================================================
--развернуть-->
1. Создать справочник с именем "ИмяСамодельногоСправочникаПрисоединенныеФайлы". Синоним "Присоединенные файлы (Имя самодельного справочника)". Создать копированием любого аналогичного справочника. После этого необходимо в реквизите "ВладелецФайла" указать в типе ссылку на самодельный справочник.
2. Прописать в список типов "Определяемые типы":
"ПрисоединенныйФайл"
СправочникСсылка."ИмяСамодельногоСправочникаПрисоединенныеФайлы"
"ПрисоединенныйФайлОбъект"
СправочникОбъект."ИмяСамодельногоСправочникаПрисоединенныеФайлы"
"ВладелецПрисоединенныхФайлов"
СправочникСсылка."ИмяСамодельногоСправочника"
"ВладелецПрисоединенныхФайловОбъект"
СправочникОбъект."ИмяСамодельногоСправочника"
3. Наводим красоту. Добавим в модуль объекта вновь созданного справочника "ИмяСамодельногоСправочникаПрисоединенныеФайлы" процедуру перед записью чтобы проставлялись картинки в соответствии с расширением файла и Автор. Ниже текст процедуры с наиболее популярным списком расширений.
Процедура ПередЗаписью(Отказ)
ЭтотОбъект.Автор = Справочники.Пользователи.НайтиПоНаименованию(Пользователи.ТекущийПользователь());
Если ЭтотОбъект.Расширение="txt" Тогда ЭтотОбъект.ИндексКартинки=10; КонецЕсли;
Если ЭтотОбъект.Расширение="pdf" Тогда ЭтотОбъект.ИндексКартинки=52; КонецЕсли;
Если ЭтотОбъект.Расширение="jpg" Тогда ЭтотОбъект.ИндексКартинки=42; КонецЕсли;
Если ЭтотОбъект.Расширение="jpeg" Тогда ЭтотОбъект.ИндексКартинки=42; КонецЕсли;
Если ЭтотОбъект.Расширение="tif" Тогда ЭтотОбъект.ИндексКартинки=46; КонецЕсли;
Если ЭтотОбъект.Расширение="xls" Тогда ЭтотОбъект.ИндексКартинки=20; КонецЕсли;
Если ЭтотОбъект.Расширение="xlsx" Тогда ЭтотОбъект.ИндексКартинки=70; КонецЕсли;
Если ЭтотОбъект.Расширение="doc" Тогда ЭтотОбъект.ИндексКартинки=18; КонецЕсли;
Если ЭтотОбъект.Расширение="docx" Тогда ЭтотОбъект.ИндексКартинки=68; КонецЕсли;
Если ЭтотОбъект.Расширение="zip" Тогда ЭтотОбъект.ИндексКартинки=34; КонецЕсли;
Если ЭтотОбъект.Расширение="heic" Тогда ЭтотОбъект.ИндексКартинки=4; КонецЕсли;
КонецПроцедуры
4. Очистить все остальное содержимое модулей объекта и менеджера.
=======================================================================
== Подсистема печати для самодельного документа (Новая версия БСП)
=======================================================================
--развернуть-->
1. ОбщийМодуль.УправлениеПечатьюПереопределяемый
В процедуру «ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов)»
Добавить строчку с документом:
СписокОбъектов.Добавить(Документы.Витал_ЗаказКроссДокинг);
2. В модуль менеджера документа добавить пустые процедуры:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КонецПроцедуры
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
КонецПроцедуры
3. В модуль формы документа добавить:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
4. На форме документа добавить Элемент подменю «ПодменюПечать».
=======================================================================
== Подсистема печати для самодельного документа
=======================================================================
--развернуть-->
1. ОбщийМодуль.УправлениеПечатьюПереопределяемый
В процедуру «ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов)»
Добавить строчку с документом:
СписокОбъектов.Добавить(Документы.Витал_ЗаказКроссДокинг);
2. В модуль менеджера документа добавить пустые процедуры:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КонецПроцедуры
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
КонецПроцедуры
3. В модуль формы документа добавить:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтаФорма);
УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма, Элементы.ПодменюПечать);
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда)
УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьНазначаемуюКоманду(Команда)
Если НЕ ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКомандуНаКлиенте(ЭтаФорма, Команда.Имя) Тогда
РезультатВыполнения = Неопределено;
ДополнительныеОтчетыИОбработкиВыполнитьНазначаемуюКомандуНаСервере(Команда.Имя, РезультатВыполнения);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ДополнительныеОтчетыИОбработкиВыполнитьНазначаемуюКомандуНаСервере(ИмяЭлемента, РезультатВыполнения)
ДополнительныеОтчетыИОбработки.ВыполнитьНазначаемуюКомандуНаСервере(ЭтаФорма, ИмяЭлемента, РезультатВыполнения);
КонецПроцедуры
4. На форме документа добавить Элемент подменю «ПодменюПечать».
=======================================================================
== ВПФ для своего документа в УТ 10.3
=======================================================================
--развернуть-->
1.Добавляем в МодульОбъекта:
Процедура Печать(ФормаВладелец) Экспорт
УниверсальныеМеханизмы.ОткрытьФормуВыбораПечатныхФормОбъекта(ЭтотОбъект, ФормаВладелец);
КонецПроцедуры
2.Добавляем в МодульФормы:
Процедура ОсновныеДействияФормыДействие(Кнопка)
ЭтотОбъект.Печать(ЭтаФорма);
КонецПроцедуры
=======================================================================
== ЗаполнитьЗначенияСвойств()
=======================================================================
--развернуть-->
Процедура ЗаполнитьЗначенияСвойств() позволяет копировать значения свойств объекта-источника в свойства объекта-приемника.
Одним из применений данной процедуры может являться заполнение реквизитов одного документа реквизитами другого.
Если объекты имеют сходную структуру, то использование процедуры встроенного языка ЗаполнитьЗначенияСвойств()
позволит скопировать значения одноименных реквизитов из одного объекта в другой.
Например: заполнение реквизитов документа "РасходнаяНакладная" значениями реквизитов документа "ПриходнаяНакладная":
РасходнаяНакладная = Документы.РасходнаяНакладная.СоздатьДокумент();
// заполняем реквизиты документа
ЗаполнитьЗначенияСвойств(РасходнаяНакладная, ПриходнаяНакладная, , "Дата, Проведен, ПометкаУдаления");
// заполняем табличную часть документа
Для каждого СтрокаСоставаПриходнойНакладной из ПриходнаяНакладная.Состав Цикл
СтрокаСоставаРасходнойНакладной = РасходнаяНакладная.Состав.Добавить();
// заполняем значения очередной строки табличной части
ЗаполнитьЗначенияСвойств(СтрокаСоставаРасходнойНакладной, СтрокаСоставаПриходнойНакладной);
КонецЦикла;
=======================================================================
== Вычисление Хэш строки
=======================================================================
--развернуть-->
//////////////////////////////////////////////////////////////////////
//СтрокаХэш - исходный текст
//hash- начальное значение hash
// М - множитель (влияет накачество хэш и производительность)
// TABLE_SIZE - размер получаемого ключа, как Максимальная величина + 1
Функция Хэш(СтрокаХэш, hash=0, M = 31, TABLE_SIZE = 18446744073709551616)
//TABLE_SIZE = 18446744073709551615; 64 бита
//M = 31; Умножитель
ДлинаСтроки = СтрДлина(СтрокаХэш);
Для к=1 по ДлинаСтроки цикл
hash = M * hash + КодСимвола(Сред(СтрокаХэш,к,1));
конеццикла;
возврат hash%TABLE_SIZE;
КонецФункции
// Для ускорения работы с большими текстами их надо передавать блоками
// Данная функция разбивает исходный текст (Параметр "Строка") на блоки
// длиной ДлинаБлока и вычислет хэш блоками возвращая результат для всего текста.
Функция ХэшБлоками(Строка, ДлинаБлока = 64, hash = 0, M = 31, TABLE_SIZE = 18446744073709551616)
НачПозиция = 1;
ДлинаСтроки = СтрДлина(Строка);
Пока НачПозиция<=ДлинаСтроки цикл
hash = Хэш(Сред(Строка, НачПозиция, ДлинаБлока), hash, M, TABLE_SIZE);
НачПозиция = НачПозиция + ДлинаБлока;
КонецЦикла;
возврат hash;
КонецФункции
=======================================================================
== Пакетная печать табличных документов
=======================================================================
--развернуть-->
// Создаем пакет
Пакет = Новый ПакетОтображаемыхДокументов;
// Документы, находящиеся в этом пакете, печатаются в 5 экземплярах
Пакет.КоличествоЭкземпляров = 5;
// Добавляем документы в пакет
ЭлементПакета1 = Пакет.Состав.Добавить();
ЭлементПакета1.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент1, УникальныйИдентификатор);
ЭлементПакета2 = Пакет.Состав.Добавить();
ЭлементПакета2.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент2, УникальныйИдентификатор);
// Добавляем вложенный пакет для третьего документа
ВложенныйПакет = Новый ПакетОтображаемыхДокументов;
ЭлементПакета3 = Пакет.Состав.Добавить();
ЭлементПакета3.Данные = ВложенныйПакет;
// Документ во вложенном пакете печатается в 2 экземплярах
ВложенныйПакет.КоличествоЭкземпляров = 2;
// Добавляем документ во вложенный пакет
ЭлементВложенногоПакета1 = ВложенныйПакет.Состав.Добавить();
ЭлементВложенногоПакета1.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент3, УникальныйИдентификатор);
// Печатаем пакет
Пакет.Напечатать();
=======================================================================
== Разбивка ПЕРИОДА НА ОТРЕЗКИ (&Периодичность)
=======================================================================
--развернуть-->
ВЫБОР
КОГДА &Периодичность = "ДЕНЬ"
ТОГДА НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ)
КОГДА &Периодичность = "НЕДЕЛЯ"
ТОГДА НАЧАЛОПЕРИОДА(Документ.Дата, НЕДЕЛЯ)
КОГДА &Периодичность = "МЕСЯЦ"
ТОГДА НАЧАЛОПЕРИОДА(Документ.Дата, МЕСЯЦ)
КОГДА &Периодичность = "КВАРТАЛ"
ТОГДА НАЧАЛОПЕРИОДА(Документ.Дата, КВАРТАЛ)
КОГДА &Периодичность = "ГОД"
ТОГДА НАЧАЛОПЕРИОДА(Документ.Дата, ГОД)
КОНЕЦ КАК Период
В ПАРАМЕТРЫ добавить "ПЕРИОД" и "ПЕРИОДИЧНОСТЬ"
Еще нужно добавить "группировку" по "Период" в макете отчета.
=======================================================================
== Вывод Реквизита на форму в динамике (в коде модуля формы)
=======================================================================
--развернуть-->
ТранспортноеСредство = Элементы.Добавить("Витал_ТранспортноеСредство", Тип("ПолеФормы"), Элементы.ГруппаПодвал);
ТранспортноеСредство.Вид = ВидПоляФормы.ПолеВвода;
ТранспортноеСредство.ПутьКДанным = "Объект.Витал_ТранспортноеСредство";
ТранспортноеСредство.Видимость = Истина;
ТранспортноеСредство.Заголовок = "Транспортное средство";
ТранспортноеСредство.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСнизу;
=======================================================================
== Вывод ТЗ в ТабличныйДокумент
=======================================================================
--развернуть-->
Функция ДанныеТаблицыЗначенийВТабличныйДокумент(ДанныеВТабличныйДокумент)
ТабличныйДокумент = Новый ТабличныйДокумент;
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДанныеВТабличныйДокумент);
Построитель.ВыводитьЗаголовокОтчета = Ложь;
Построитель.Вывести(ТабличныйДокумент);
ТабличныйДокумент.УдалитьОбласть(ТабличныйДокумент.Область(1,1,ТабличныйДокумент.ВысотаТаблицы,1),ТипСмещенияТабличногоДокумента.ПоГоризонтали);
Возврат ТабличныйДокумент;
КонецФункции
====== А потом его можно записать в файл ЭКСЕЛЬ:
ИмяФайлаТД = КВФ+ПолнаяДата()+".xls";
ТД = Новый ТабличныйДокумент;
ТД = ДанныеТаблицыЗначенийВТабличныйДокумент(ВыборкаДляВыгрузки);
ТД.ИспользуемоеИмяФайла = ИмяФайлаТД;
ТД.Записать(ИмяФайлаТД,ТипФайлаТабличногоДокумента.XLS97);
=======================================================================
== Вывод формы списка по условию отбора
=======================================================================
--развернуть-->
Процедура ПриОткрытии()
Если РольДоступна("Внешник") Тогда
СправочникСписок.Отбор.Ответственный.ВидСравнения = ВидСравнения.Равно;
СправочникСписок.Отбор.Ответственный.Значение = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя,Истина).Ссылка;
СправочникСписок.Отбор.Ответственный.Использование = Истина;
КонецЕсли;
КонецПроцедуры
=======================================================================
== К одному ТабДок присоединяет другой ТабДок со своим форматом строк
=======================================================================
--развернуть-->
// Процедура ПрисоединитьТабличныйДокумент осуществляет вывод Присоединяемого документа под указанным
// С возможностью создания нового формата строк для всей области присоединяемого документа
// Удобно использовать, чтобы колонки различной ширины не разъезжались
//
// Параметры:
// ОсновнойДокумент - ТабличныйДокумент - документ, куда будут добавлены области присоединяемого документа
// ПрисоединяемыйДокумент - ТабличныйДокумент/ОбластьЯчеекТабличногоДокумента - документ, который присоединяем
// СоздатьФорматСтрок - Булево - флаг, указывающий на то, что необходимо создать свой формат строк
//
Процедура ПрисоединитьТабличныйДокумент(ОсновнойДокумент, Знач ПрисоединяемыйДокумент, Знач СоздатьФорматСтрок = Ложь) Экспорт
ВремТабДок = Новый ТабличныйДокумент;
ОбластьЯчеек = ВремТабДок.Вывести(ПрисоединяемыйДокумент);
Если СоздатьФорматСтрок Тогда
ОбластьЯчеек.СоздатьФорматСтрок();
КонецЕсли;
ОсновнойДокумент.Вывести(ВремТабДок);
КонецПроцедуры
=======================================================================
== ВидыСтавокНДС
=======================================================================
--развернуть-->
Перечисление осталось. Но если Вы посмотрите в справочнике Номенклатуры форму элемента, то на форме стоит выбор значений, например:
20%
20/120
10%
10/110
0%
БезНДС
То есть, не всех значений из Перечисления.СтавкиНДС.
И тип этого поля, если посмотреть в конфигураторе, Объект.ВидСтавкиНДС,
где ВидСтавкиНДС - ПеречислениеСсылка.ВидыСтавокНДС
со значениями:
Общая
ОбщаяРасчетная
Пониженная
ПониженнаяРасчетная
Нулевая
БезНДС
=======================================================================
== Запуск "Обновление версии программы"
=======================================================================
--развернуть-->
Нужно запустить программу с ключом:
/С ЗапуститьОбновлениеИнформационнойБазы
=======================================================================
== Текст запроса на получение цен из регистра на дату документа
=======================================================================
--развернуть-->
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЦеныНоменклатуры.Номенклатура.Производитель,
ВложенныйЗапрос.Номенклатура,
ЦеныНоменклатуры.ВидЦены,
ЦеныНоменклатуры.Цена,
ВложенныйЗапрос.Ссылка КАК Ссылка
ИЗ
(ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО РеализацияТоваровУслугТовары.Номенклатура = ЦеныНоменклатуры.Номенклатура
И РеализацияТоваровУслугТовары.Ссылка.Дата >= ЦеныНоменклатуры.Период
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугТовары.Ссылка,
РеализацияТоваровУслугТовары.Номенклатура) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО ВложенныйЗапрос.Номенклатура = ЦеныНоменклатуры.Номенклатура
И ВложенныйЗапрос.Период = ЦеныНоменклатуры.Период
ГДЕ
ЦеныНоменклатуры.ВидЦены = &ВидЦены
И ЦеныНоменклатуры.Номенклатура.Производитель В(&Производитель)
И ВложенныйЗапрос.Ссылка.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -45) И &ТекущаяДата
УПОРЯДОЧИТЬ ПО
Ссылка
=======================================================================
== Получение сведений о контрагенте
=======================================================================
--развернуть-->
ОбАгенте = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Агент.Ссылка, Дата);
Сведения = Новый Структура();
Сведения.Вставить("Агент", ОбАгенте);
ПредставлениеАгента = ОбщегоНазначенияБПВызовСервера.ОписаниеОрганизации(Сведения.Агент,
"НаименованиеДляПечатныхФорм,ЮридическийАдрес,Телефоны,НомерСчета,Банк,БИК,КоррСчет");
=======================================================================
== Вывести чистый номер документа на печать
=======================================================================
--развернуть-->
ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(НомДок,Истина,Истина)
=======================================================================
== Програмная запись ДопСвойств и ДопРеквизитов объектов
=======================================================================
--развернуть-->
Процедура ПриЗаписи(Отказ)
ТаблицаСвойств = Новый ТаблицаЗначений;
ТаблицаСвойств.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаСвойств.Колонки.Добавить("Значение");
СтрокаСвойства = ТаблицаСвойств.Добавить();
СтрокаСвойства.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "НаименованиеДопСвойстваИлиХарактеристики");
СтрокаСвойства.Значение = "ЗначениеДопСвойстваИлиХарактеристики";
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ЭтотОбъект.Ссылка, ТаблицаСвойств);
КонецПроцедуры
=======================================================================
== Програмная получение ДопСвойств и ДопРеквизитов объектов
=======================================================================
--развернуть-->
Функция ПолучитьДополнительноеСведение(Объект, ИмяСвойства) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеСведения.Объект КАК Объект,
| ДополнительныеСведения.Свойство КАК Свойство,
| ДополнительныеСведения.Значение КАК Значение
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Объект = &Объект
| И ДополнительныеСведения.Свойство.Имя ПОДОБНО &Имя";
Запрос.УстановитьПараметр("Имя", ИмяСвойства);
Запрос.УстановитьПараметр("Объект", Объект);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат ВыборкаДетальныеЗаписи.Значение;
КонецЕсли;
Возврат Неопределено;
КонецФункции
=======================================================================
== Порядок применения расширений если их больше чем одно!
=======================================================================
--развернуть-->
В первую очередь применяются расширения с назначением Исправление,
после этого Адаптация и самыми последними — Дополнение.
=======================================================================
== Руководитель организации
=======================================================================
--развернуть-->
Руководители = ОтветственныеЛицаБП.ОтветственныеЛица(Выборка.Организация, Выборка.Дата);
ОбластьПодвал.Параметры.ФИОРуководителя = Руководители.Руководитель;
=======================================================================
== Число прописью
=======================================================================
--развернуть-->
с копейками
ЧислоПрописью(Число, "Л=ru_RU;ДП=Истина", "рубль,рубля,рублей,м,копейка,копейки,копеек,ж,2")
копейки числом
ЧислоПрописью(Число, "Л=ru_RU", "рубль,рубля,рублей,м,копейка,копейки,копеек,ж,2")
=======================================================================
== Дата документа из ссылки
=======================================================================
--развернуть-->
ДатаДокумента = Дата(Строка(Прав(ДатаДок,4) + Сред(ДатаДок,4,2) + Лев(ДатаДок,2)));
=======================================================================
== Месяц прописью
=======================================================================
--развернуть-->
Функция ПолучитьМесяцПрописью(Дата)
НомерМесяца = Месяц(Дата);
СоответствиеМесяцев = Новый Соответствие();
СоответствиеМесяцев.Вставить(1, "Января");
СоответствиеМесяцев.Вставить(2, "Февраля");
СоответствиеМесяцев.Вставить(3, "Марта");
СоответствиеМесяцев.Вставить(4, "Апреля");
СоответствиеМесяцев.Вставить(5, "Мая");
СоответствиеМесяцев.Вставить(6, "Июня");
СоответствиеМесяцев.Вставить(7, "Июля");
СоответствиеМесяцев.Вставить(8, "Августа");
СоответствиеМесяцев.Вставить(9, "Сентября");
СоответствиеМесяцев.Вставить(10, "Октября");
СоответствиеМесяцев.Вставить(11, "Ноября");
СоответствиеМесяцев.Вставить(12, "Декабря");
Возврат СоответствиеМесяцев[НомерМесяца];
КонецФункции
=======================================================================
== Получить Фамилию c Инициалами
=======================================================================
--развернуть-->
Функция ПолучитьФамилиюСИнициалами(знач ФИО)
ФИОСПереносами = СтрЗаменить(ФИО, " ", Символы.ПС);
ЧастиСтроки = Новый Массив;
Для Индекс = 1 По СтрЧислоСтрок(ФИОСПереносами) Цикл
Стр = СтрПолучитьСтроку(ФИОСПереносами, Индекс);
Если ЗначениеЗаполнено(Стр) Тогда
ЧастиСтроки.Добавить(СокрЛП(Стр));
КонецЕсли;
КонецЦикла;
Результат = "";
Если ЧастиСтроки.Количество() > 0 Тогда
Результат = Результат + ЧастиСтроки[0];
Если ЧастиСтроки.Количество() > 1 Тогда
Результат = Результат + " " + Лев(ЧастиСтроки[1], 1) + ".";
Если ЧастиСтроки.Количество() > 2 Тогда
Результат = Результат + " " + Лев(ЧастиСтроки[2], 1) + ".";
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
=======================================================================
== Получить ИТОГ по Колонке ДинамическогоСписка
=======================================================================
--развернуть-->
Процедура РассчитатьИтоги()
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ЭтотОбъект.ЭтаФорма.Элементы.СуммаКОплате.ТекстПодвала = "Итого: " + Формат(Результат.Итог("СуммаКОплате"),"ЧДЦ=2; ЧН=-");
КонецПроцедуры
=======================================================================
== Получить ТЗ Из ДинамическогоСписка
=======================================================================
--развернуть-->
&НаСервере
Функция Получить_ТЗ_Из_ДинамическогоСписка()
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТЗ = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ТЗ;
КонецФункции
=======================================================================
== Word'овский макет
=======================================================================
--развернуть-->
&НаСервере
---
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
СсылкаМакет = ОбработкаОбъект.ПолучитьМакет("ВордМакет");
Word = СсылкаМакет.Получить();
СсылкаМакет = Word.Application.Documents(1);
СсылкаМакет.Activate();
Word.Bookmarks("Область-Закладка").Select();
Word.Application.Selection.TypeText("Вставляемый текст");
СсылкаМакет.Application.Visible = Истина;
=======================================================================
== Вывод на печать макета в форму печати
=======================================================================
--развернуть-->
&НаСервере
Процедура ПечатьНакладнойНаСервере(МассивОбъектов)
КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяВРЕГ");
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяМакета");
КоллекцияПечатныхФорм.Колонки.Добавить("Картинка");
КоллекцияПечатныхФорм.Колонки.Добавить("ПолныйПутьКМакету");
КоллекцияПечатныхФорм.Колонки.Добавить("СинонимМакета");
КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент");
КоллекцияПечатныхФорм.Колонки.Добавить("Экземпляров");
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяФайлаПечатнойФормы");
КоллекцияПечатныхФорм.Колонки.Добавить("ОфисныеДокументы");
ПечФорма = КоллекцияПечатныхФорм.Добавить();
ПечФорма.ИмяВРЕГ = ВРег("УПД");
ПечФорма.ИмяМакета = "Печать_накладной";
ПечФОрма.ПолныйПутьКМакету = "Документ.Накладная.Печать_накладной";
ПечФОрма.ТабличныйДокумент = Документы.Накладная.ПолучитьМакет("Печать_накладной");
ПечФорма.Экземпляров = 1;
Строка = КоллекцияПечатныхФорм.Добавить();
Строка.ИмяМакета = "Печать_накладной";
Строка.ИмяВРЕГ = "УПД";
Строка.СинонимМакета = "";
Строка.ТабличныйДокумент = Документы.Накладная.СформироватьПечатнуюФормуНакладной(МассивОбъектов);
Строка.Экземпляров = 1;
Строка.Картинка = "";
Строка.ПолныйПутьКМакету = "";
Строка.ИмяФайлаПечатнойФормы = "";
Строка.ОфисныеДокументы = "";
ПараметрыОтправки=Новый Структура;
ПараметрыОтправки.Вставить("Получатель");
ПараметрыОтправки.Вставить("Текст","");
ПараметрыОтправки.Вставить("Тема","");
ПараметрыВывода = Новый Структура;
ПараметрыВывода.Вставить("ЗаголовокФормы",Объект.Ссылка);
ПараметрыВывода.Вставить("ДоступнаПечатьПоКомплектно",Ложь);
ПараметрыВывода.Вставить("ПараметрыОтправки",ПараметрыОтправки);
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами",Ложь);
ОбъектыПечати = Новый СписокЗначений;
ОбъектыПечати = Документы.Накладная.ПолучитьМакет("Печать_накладной");
КонецПроцедуры
&НаКлиенте
Процедура ПечатьНакладной(Команда)
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.Ссылка);
ПечатьНакладнойНаСервере(МассивОбъектов);
ПараметрыОткрытия = Новый Структура("ИмяМенеджераПечати,ИменаМакетов,ПараметрКоманды,ПараметрыПечати");
ПараметрыОткрытия.ИмяМенеджераПечати = "Документы.Накладная.СформироватьПечатнуюФормуНакладной(МассивОбъектов)";
ПараметрыОткрытия.ИменаМакетов = "Документ.Накладная.Печать_накладной";
ПараметрыОткрытия.ПараметрКоманды = МассивОбъектов;
ПараметрыОткрытия.ПараметрыПечати = Неопределено;
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ЭтаФорма, Строка(Новый УникальныйИдентификатор));
КонецПроцедуры
=======================================================================
== Число 1234.56 прописью с копейками
=======================================================================
--развернуть-->
ЧислоПрописью(1234.56, "Л=ru_RU;ДП=Истина", "рубль,рубля,рублей,м,копейка,копейки,копеек,ж,2");
=======================================================================
== Установки цвета ВАЖНОЙ КНОПКИ
=======================================================================
--развернуть-->
ЦветФона : FFE100
ЦветТекста : 4D4D4D
ЦветРамки : 71641A
=======================================================================
== Работа со строкой
=======================================================================
--развернуть-->
СтрРазделить();
Функция распила строки
=======================================================================
== Параметры открытия формы
=======================================================================
--развернуть-->
УсловияОтбора = Новый Структура;
УсловияОтбора.Вставить("ТипКонтрагента", "Поставщик");
УсловияОтбора.Вставить("Лояльность", "Надежный");
ПараметрыФормы = Новый Структура ("Отбор", УсловияОтбора);
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ПараметрыФормы);
=======================================================================
== РеквизитФормы
=======================================================================
--развернуть-->
Так, например, можно получить наполненный данными СправочникОбъект на основании данных формы, если вызвать метод «РеквизитФормыВЗначение(«Объект»). При этом произойдет то, что описано выше – будет создан новый СправочникОбъект и наполнен данными из указанного реквизита данных формы.
Обратное преобразование выполняется методом «ЗначениеВРеквизитФормы». Если мы произвели какие-то действия с данными СправочникОбъект, например, очистили табличную часть, то мы должны поместить наши изменения обратно в форму.
=======================================================================
== Временное хранилище
=======================================================================
--развернуть-->
Данные помещаются в хранилище по ссылке. Это значит, что помещая данные в хранилище и изменяя их вне хранилища мы, фактически, меняем и само хранилище, т.к. в нем лежит только ссылка на данные. Пример:
Массив = Новый Массив; Массив.Добавить("Привет");
Адрес = ПоместитьВоВременноеХранилище(Массив);
Массив.Добавить("До свидания");
МассивИзХранилища = ПолучитьИзВременногоХранилища(Адрес);
Сообщить(Массив = МассивИзХранилища); // Истина
Сообщить(МассивИзХранилища.Количество()); // 2 элемента
В приведенном коде массив помещается в хранилище, после чего к нему добавляется еще один элемент. Видим, что в хранилище лежит тот же самый объект и объект получаемый из хранилища тоже изменен.
=======================================================================
== Вызов ФормыВыбора и получение значения выбора
=======================================================================
--развернуть-->
&НаКлиенте
Процедура ВыбратьНоменклатуру(Команда)
ОписаниеВыбора = Новый ОписаниеОповещения(«ОбработатьВыборНоменклатуры»,ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыборНоменклатуры(РезультатЗакрытия,ДопПараметры) Экспорт
Если Не ЗначениеЗаполнено(РезультатЗакрытия) Тогда
Возврат;
КонецЕсли;
ВыбраннаяНоменклатура = РезультатЗакрытия;
КонецПроцедуры
Где ВыбраннаяНоменклатура это реквизит формы.
Заметьте, процедура ОбработатьВыборНоменклатуры, которую мы указали в описании оповещения, обязательно должна быть экспортной.
Теперь нам осталась указать объект описание выбора в шестом параметре метода ОткрытьФорму
&НаКлиенте
Процедура ВыбратьНоменклатуру(Команда)
ОписаниеВыбора = Новый ОписаниеОповещения(«ОбработатьВыборНоменклатуры»,ЭтаФорма);
ОткрытьФорму(«Справочник.Номенклатура.ФормаВыбора»,,,,,,
ОписаниеВыбора,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
=======================================================================
== Запрос на получение ОСТАТКОВ
=======================================================================
--развернуть-->
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстатки.КоличествоОстаток КАК ТекОстаток,
| ХозрасчетныйОстатки.КоличествоОстатокДт КАК ТекОстатокДТ
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &Дата,
| Счет = &Счет,
| &МассивСубконто,
| Организация = &Организация
| И Субконто1 = &Номенклатура
| И Субконто2 = &Склад) КАК ХозрасчетныйОстатки";
МассивСубконто = Новый Массив;
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура);
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады);
Запрос.УстановитьПараметр("МассивСубконто", МассивСубконто);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Номенклатура", СтрокаТЧ.Номенклатура);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.ТоварыНаСкладе);
Запрос.УстановитьПараметр("Дата",ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Номенклатура);
КонецЦикла;
=======================================================================
== Таблица значений в Массив и обратно
=======================================================================
--развернуть-->
// Функция преобразует ТаблицуЗначений в Массив из структур.
//
Функция ПреобразоватьТаблицуЗначенийВМассив(тзДанные) Экспорт
мсДанные = Новый Массив;
// Запишем в массив
Для Каждого СтрокаТЗ Из тзДанные Цикл
стСтрокаТаблицы = Новый Структура;
Для Каждого ИмяКолонки Из тзДанные.Колонки Цикл
стСтрокаТаблицы.Вставить(ИмяКолонки.Имя, СтрокаТЗ[ИмяКолонки.Имя]);
КонецЦикла;
мсДанные.Добавить(стСтрокаТаблицы);
КонецЦикла;
Возврат мсДанные;
КонецФункции // ПреобразоватьТаблицуЗначенийВМассив()
// Функция преобразует Массив из структур в ТаблицуЗначений.
//
Функция ПреобразоватьМассивВТаблицуЗначений(мсДанные) Экспорт
тзДанные = Новый ТаблицаЗначений;
Для Каждого ЭлементМассива Из мсДанные Цикл
// Рисуем колонки для таблицы
Если тзДанные.Колонки.Количество() = 0 Тогда
Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
тзДанные.Колонки.Добавить(ЗначениеСтруктуры.Ключ);
КонецЦикла;
КонецЕсли;
// Добавляем данные в таблицу
НоваяСтрока = тзДанные.Добавить();
Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
НоваяСтрока[ЗначениеСтруктуры.Ключ] = ЗначениеСтруктуры.Значение;
КонецЦикла;
КонецЦикла;
Возврат тзДанные;
КонецФункции // ПреобразоватьМассивВТаблицуЗначений()
=======================================================================
== Код 1C v 7.x
=======================================================================
--развернуть-->
Процедура Выполнить()
Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"v7plus.dll")<>1 Тогда
Предупреждение("Компонента не обнаружена");
Возврат;
КонецЕсли;
Анализатор=СоздатьОбъект("AddIn.XMLParser");
Корень=Анализатор.СоздатьДокумент();
План=Корень.СоздатьПодчиненныйЭлемент("ПланСчетов");
Счет=СоздатьОбъект("Счет.Основной");
Родитель=СоздатьОбъект("Счет.Основной");
Счет.ВыбратьСчета();
Пока Счет.ПолучитьСчет()=1 Цикл
// если это счет, а не субсчет
Если Счет.Уровень()=1 Тогда
Родитель.НайтиПоКоду(Счет.Код);
СчетXML=План.СоздатьПодчиненныйЭлемент("Счет");
СчетXML.УстановитьАтрибут("Код", Счет.Код);
СчетXML.УстановитьАтрибут("Валютный", Счет.Валютный);
СчетXML.УстановитьАтрибут("Количественный", Счет.Количественный);
СчетXML.УстановитьАтрибут("Забалансовый", Счет.Забалансовый);
Если Счет.Активный=1 Тогда
СчетXML.УстановитьАтрибут("вид","активный");
ИначеЕсли Счет.Активный=2 Тогда
СчетXML.УстановитьАтрибут("вид","пассивный");
Иначе
СчетXML.УстановитьАтрибут("вид","активно-пассивный");
КонецЕсли;
СчетXML.Значение=Счет.Наименование;
Иначе
Если Счет.ПринадлежитГруппе(Родитель)=1 Тогда
СубсчетXML=СчетXML.СоздатьПодчиненныйЭлемент("Субсчет");
СубсчетXML.УстановитьАтрибут("Код", Счет.Код);
// аналогично устанавливаем все атрибуты на элемент СубсчетXML
СубсчетXML.Значение=Счет.Наименование;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Корень.Записать(КаталогПрограммы()+"plan.xml");
КонецПроцедуры
=======================================================================
== Форматирование
=======================================================================
--развернуть-->
Формат(ТабДок.Количество, "Ч-15.0, ");
Формат(ТабДок.Количество, "ЧГ-0, ");
Формат(Дата, "ДЛФ=Д"); // 01.01.2005
Формат(Дата, "ДЛФ=ДД"); // 1 января 2005 г.
КодБезРазделителяТриад = СтрЗаменить(Строка(Код),Символ(160),"");
=======================================================================
== Закрыть все открытые окна
=======================================================================
--развернуть-->
НомерОкна = 1;
Окна = ПолучитьОкна();
Пока НомерОкна<Окна.Количество() Цикл
Если Не Окна.Получить(НомерОкна).Заголовок="Начальная страница" Тогда
Форма = Окна.Получить(НомерОкна).ПолучитьСодержимое();
Форма.Закрыть();
КонецЕсли;
НомерОкна = НомерОкна + 1;
КонецЦикла;
Tags: справочник функций 1С, справка по 1С, полезный функционал 1С, рабочие механизмы 1С, helpme 1C, функции 1С, helpme1s