Как программно удалить все документы в базе? Код 1C v 8.х Для НомТ = 1 По Метаданные.Документы.Количество() Цикл
ИмяДок = Метаданные.Документы.Получить(НомТ-1).Имя;
Запрос = НОвый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|Док.Ссылка КАК Док_
|ИЗ Документ." + ИмяДок + " КАК Док";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокОБ = Выборка.Док_.ПолучитьОБъект();
ДокОБ.Удалить();
КонецЦикла;
КонецЦикла;
Категория:
Документы Получение ссылки по GUIDу в COMConnector Известно:
ИмяДокумента (Тип Строка)
УникальныйИдентификатор искомого документа в базе-источнике (тип Строка)
COMСоединение установлено.
Код 1C v 8.х МД=ВнешняяБаза.XMLTypeOf(ВнешняяБаза.Документы[ИмяДокумента].ПустаяСсылка());
Попытка
тСсылка=ВнешняяБаза.XMLValue(ВнешняяБаза.FromXMLType(МД),ЭтотУникальныйИдентификатор);
Исключение
Сообщить(“COM: “+ОписаниеОшибки());
возврат;
КонецПопытки;
тОбъект=тСсылка.ПолучитьОбъект();
ЗаписьXML=ВнешняяБаза.NewObject(“ЗаписьXML”);
ЗаписьXML.УстановитьСтроку();
ВнешняяБаза.WriteXML(ЗаписьXML,тОбъект);
тСтрXML=ЗаписьXML.Закрыть();
Для перечислений:
ИмяПеречисления (Тип Строка)
ИмяЗначенияПеречисления (Тип Строка)
COMСоединение установлено.
Код 1C v 8.х МД=ВнешняяБаза.XMLTypeOf(ВнешняяБаза.Перечисления[ИмяПеречисления].ПустаяСсылка());
Попытка
тСсылка=ВнешняяБаза.XMLValue(ВнешняяБаза.FromXMLType(МД),ИмяЗначенияПеречисления);
Исключение
Сообщить(“COM: “+ОписаниеОшибки());
возврат;
КонецПопытки;
в переменной тСсылка – лежит Ссылка на объект (тип COMОбъект)
Категория:
COM-объекты, WMI, WSH Как подключиться к базе 1С 8.х из 1С 7.7 ? Код 1C v 7.x //Инициализация соединения в 7.7:
Коннектор=Создать0бъект("V82.COMConnector");
// Для 8.1 ("V81.COMConnector");
// для 8.0 ("V8.COMConnector");
// создается объект COM -соединение Соединение = V8.Connect ("File=""c:\InfoBases\Trade""; Usr =""Director"";")
v8 =Коннектор.Connect("File="""+СокрЛП(ПутьКБазе) + """; Usr="""СокрЛП(Логин) +"""; Pwd=""" +СокрЛП(Пароль)+""" ");
где переменные ПутьКБазе, Логин, Пароль — поля на форме.
После выполнения подключения имеем объект v8, через который можно обращаться к свойствам и методам нужной базы.
Допустим в 8.х есть экспортная функция возвращающая выборку документов:
Код 1C v 8.х Функция ВернутьВыборкуДокументов(ИмяДокумента,Дата1,Дата2) Экспорт
Запрос = Новый Запрос;
ТекстЗапроса =
"ВЫБРАТЬ
| Док.Ссылка КАК {ИмяДокумента}
|ИЗ
| Документ. {ИмяДокумента} КАК Док
|ГДЕ
| Док.Дата МЕЖДУ &Дата1 И &Дата2";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"{ИмяДокумента}",ИмяДокумента);
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("Дата1",Дата1);
Запрос.УстановитьПараметр("Дата2",Дата2);
Выборка = Запрос.Выполнить().Выбрать();
Возврат Выборка;
Из 7.7 через
Коннектор обращаемся к ней так:
Код 1C v 7.x Выборка = v8.ВернутьВыборкуДокументов("РеализацияТоваров", ДатаС,ДатаПо);
Пока Выборка.Следующий() = -1 Цикл
Док = Выборка.РеализацияТоваров;
Сообщить(Док);
КонецЦикла;
Категория:
COM-объекты, WMI, WSH Печать табличной части документа в Word'e Вот пример кода создания и заполнения таблиц(пример для 7.7, в 8.х заменить первую строку на МСВорд Новый COMОбъект("Word.Application")):
Код 1C v 7.x МСВорд = СоздатьОбъект("Word.Application");
Документ = МСВорд.Documents;
Документ.Add();
Документ = МСВорд.ActiveDocument();
Документ.Paragraphs.Add();
Диапазон = Документ.Paragraphs(Документ.Paragraphs.Count()).Range;
//Добавим таблицу фиксированного размера 3х2
Документ.Tables.Add(Диапазон,3,2);
Документ.Tables(1).Range.S_elect();
Выбор = МСВорд.S_election();
Выбор.Style = "Сетка таблицы";
//Установим ширину обоих колонок по 8 см
Документ.Tables(1).Columns(1).Width= МСВорд.CentimetersToPoints(8);
Документ.Tables(1).Columns(2).Width= МСВорд.CentimetersToPoints(8);
//Заполнение
Документ.Tables(1).Cell(1,1).Range.Text = "Это первая сирока, первая колонка";
Документ.Tables(1).Cell(2,1).Range.Text = "";
Документ.Tables(1).Cell(3,1).Range.Text = "";
Документ.Tables(1).Cell(1,2).Range.Text = "";
Документ.Tables(1).Cell(2,2).Range.Text = "";
Документ.Tables(1).Cell(3,2).Range.Text = "Это третья строка, вторая колонка";
//Добавим таблицу с произвольным количеством строк, для примера возьмем 4 колонки
//Сначала выведем заголовок таблицы
Документ.Paragraphs.Add();
Диапазон = Документ.Paragraphs(Документ.Paragraphs.Count()).Range;
Документ.Tables.Add(Диапазон,1,4);
Документ.Tables(2).Range.S_elect();
Выбор = МСВорд.S_election();
Выбор.Style = "Сетка таблицы";
Выбор.Rows.AllowBreakAcrossPages = 0;
//Зададим ширину колонок
Документ.Tables(2).Columns(1).Width= МСВорд.CentimetersToPoints(2);
Документ.Tables(2).Columns(2).Width= МСВорд.CentimetersToPoints(4);
Документ.Tables(2).Columns(3).Width= МСВорд.CentimetersToPoints(4);
Документ.Tables(2).Columns(4).Width= МСВорд.CentimetersToPoints(10);
//Заполнение шапки таблицы
Документ.Tables(2).Cell(1,1).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,1).Range.Text = "№";
Документ.Tables(2).Cell(1,2).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,2).Range.Text = "Колонка 2";
Документ.Tables(2).Cell(1,3).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,3).Range.Text = "Колонка 3";
Документ.Tables(2).Cell(1,4).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,4).Range.Text = "Примечание";
//Для документа можно так цикл организовать:
//Предположим, что Док - это документ, тогда
Для А =1 По Док.КоличествоСтрок() Цикл
Док.ПолучитьСтрокуПоНомеру(А);
Выбор.I_nsertRowsBelow(1);
Документ.Tables(2).Cell(А+1,1).Range.Text = Строка(А);//номер строки
Документ.Tables(2).Cell(А+1,2).Range.Text = Док.РеквизитТабличнойЧастиДокумента1;
Документ.Tables(2).Cell(А+1,3).Range.Text = Док.РеквизитТабличнойЧастиДокумента2;
Документ.Tables(2).Cell(А+1,4).Range.Text = Док.РеквизитТабличнойЧастиДокумента3;
КонецЦикла;
//или выведем таблицу по таблице значений
Для А = 1 По ТЗ.КоличествоСтрок() Цикл
//Добавим строку в таблицу
Выбор.I_nsertRowsBelow(1);
Документ.Tables(2).Cell(А+1,1).Range.Text = Строка(А);//номер строки
Документ.Tables(2).Cell(А+1,2).Range.Text = ТЗ.ПолучитьЗначение(А,1);
Документ.Tables(2).Cell(А+1,3).Range.Text = ТЗ.ПолучитьЗначение(А,2);
Документ.Tables(2).Cell(А+1,4).Range.Text = ТЗ.ПолучитьЗначение(А,3);
КонецЦикла;
//Запишем Документ
Документ.SaveAs("ПутьИИмяДокумента",0);
Документ.Close();
ТЗ - это таблица значений.
Для документа можно так цикл организовать:
Предположим, что Док - это документ, тогда
Код 1C v 8.2 УП Для А =1 По Док.КоличествоСтрок() Цикл
Док.ПолучитьСтрокуПоНомеру(А);
Выбор.I_nsertRowsBelow(1);
Документ.Tables(2).Cell(А+1,1).Range.Text = Строка(А);//номер строки
Документ.Tables(2).Cell(А+1,2).Range.Text = Док.РеквизитТабличнойЧастиДокумента1;
Документ.Tables(2).Cell(А+1,3).Range.Text = Док.РеквизитТабличнойЧастиДокумента2;
Документ.Tables(2).Cell(А+1,4).Range.Text = Док.РеквизитТабличнойЧастиДокумента3;
КонецЦикла;
Категория:
Работа с Microsoft Office и OpenOffice Функция проверки на дубли строк в табличной части документа Код 1C v 8.х Функция ПроверкаНаДублиСтрок(Ссылка, ИмяТаблЧасти = "Товары", Колонка = "Товар", Колонка2 = "", Отказ = Ложь, Заголовок = "") Экспорт
ИмяДока = Ссылка.Метаданные().Имя;
ЕстьДополнительно = Колонка2 <> "";
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Док." + Колонка + " КАК ID,
| ПРЕДСТАВЛЕНИЕ(Док." + Колонка + ") КАК Сверка," + ?(ЕстьДополнительно,"
| ПРЕДСТАВЛЕНИЕ(Док." + Колонка2 + ") КАК Сверка2,", "") + "
| Док.НомерСтроки КАК НомерСтроки,
| ДокКопия.НомерСтроки КАК НомерСтрокиКопия
|ИЗ
| Документ." + ИмяДока + "." + ИмяТаблЧасти + " КАК Док
| СОЕДИНЕНИЕ Документ." + ИмяДока + "." + ИмяТаблЧасти + " КАК ДокКопия
| ПО Док." + Колонка + "= ДокКопия." + Колонка + "
| И Док.НомерСтроки < ДокКопия.НомерСтроки" + ?(ЕстьДополнительно,"
| И Док." + Колонка2 + "= ДокКопия." + Колонка2, "") + "
|ГДЕ
| Док.Ссылка = &Ссылка
| И ДокКопия.Ссылка = &Ссылка
|
|УПОРЯДОЧИТЬ ПО
| ID,
| НомерСтроки";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить().Выбрать();
ЕстьДубль = Ложь;
СтрокаСообщения = "Проверка табличной части на дублирующиеся строки:
|Обнаружены одинаковые позиции! Колонк"
+ ?(ЕстьДополнительно, "и: " +Колонка +" и " + Колонка2, "а: "+ Колонка);
Пока Результат.Следующий() Цикл
Если ЕстьДополнительно Тогда
Значение = СокрП(Результат.Сверка)+ ", " + Результат.Сверка2;
Иначе
Значение = Результат.Сверка;
КонецЕсли;
СтрокаСообщения = СтрокаСообщения + Символы.ПС + "Строка № " + Формат(Результат.НомерСтроки, "ЧГ=")
+ " и строка № " + Формат(Результат.НомерСтрокиКопия, "ЧГ=")
+ " значение: " + Значение;
ЕстьДубль = Истина;
КонецЦикла;
Если ЕстьДубль Тогда
обСообщитьОбОшибке(СтрокаСообщения, Отказ, Заголовок);
КонецЕсли;
Возврат Отказ;
КонецФункции
Категория:
Документы Пример проверки на заполнения нужных нам колонок в табличной части документа Код 1C v 8.х МассивКолонок = Новый Массив;
МассивКолонок.Добавить("Количество");
СсылочныеКолонки = Новый Соответствие;
СсылочныеКолонки["Адрес"] = Справочники.АдресаЯчеек.ПустаяСсылка();
СсылочныеКолонки["Товар"] = Справочники.Номенклатура.ПустаяСсылка();
ПроверкаЗаполненияТабличнойЧасти(Ссылка, "Товары", МассивКолонок, СсылочныеКолонки, Отказ);
//выбирает не заполненные строки
//СсылкаНаОбъект - ссылка на проверяемый документ, ИмяТабЧасти - имя проверяемой табличной части,
//СписокКолонок - массив с именами колонок
//СсылочныеКолонки - соответсвие имен колонок и пустых ссылок типов этих колонок
Процедура ПроверкаЗаполненияТабличнойЧасти(СсылкаНаОбъект, ИмяТабЧасти = "Товары", СписокКолонок, СсылочныеКолонки = Неопределено, Отказ = Ложь, Заголовок = "") Экспорт
ИмяДока = СсылкаНаОбъект.Метаданные().Имя;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
ТекстЗапроса = "ВЫБРАТЬ
| Док.НомерСтроки
|ИЗ
| Документ." + ИмяДока + "." + ИмяТабЧасти + " КАК Док
|ГДЕ
| Док.Ссылка = &Ссылка И (";
СтрокаКолонок = "";
Если СсылочныеКолонки <> Неопределено Тогда
Для каждого Колонка Из СсылочныеКолонки Цикл
ТекстЗапроса = ТекстЗапроса + " Док." + Колонка.Ключ + " = &" + Колонка.Ключ + " ИЛИ";
СтрокаКолонок = СтрокаКолонок + Колонка.Ключ + ", ";
Запрос.УстановитьПараметр(Колонка.Ключ, Колонка.Значение);
КонецЦикла;
КонецЕсли;
Для каждого Колонка Из СписокКолонок Цикл
ТекстЗапроса = ТекстЗапроса + " Док." + Колонка + " = 0 ИЛИ";
СтрокаКолонок = СтрокаКолонок + Колонка + ", ";
КонецЦикла;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Колонка + " = 0 ИЛИ", Колонка + " = 0)");
Запрос.Текст = ТекстЗапроса;
СтрокаСообщения = "Проверка табличной части на заполнение по колонкам: " + СтрокаКолонок;
Результат = Запрос.Выполнить().Выбрать();
ЕстьОшибки = Ложь;
Пока Результат.Следующий() Цикл
СтрокаСообщения = СтрокаСообщения + Символы.ПС
+ "В строке № " + Формат(Результат.НомерСтроки, "ЧГ=0")
+ " есть не заполненное значение!";
ЕстьОшибки = Истина;
КонецЦикла;
Если ЕстьОшибки Тогда
СообщитьОбОшибке(СтрокаСообщения, Отказ, Заголовок);
КонецЕсли;
КонецПроцедуры
Категория:
Документы Получить список Документов конфигурации Код 1C v 8.х //ЭлементыФормы.ОбъектПоиска - Поле Выбора на форме
СписокВыбора = ЭлементыФормы.ОбъектПоиска.СписокВыбора;
Для Каждого Документ Из Метаданные.Документы Цикл
//Проверим, есть ли права на просмотр? Да- добавляем, Нет - пропускаем
Если ПравоДоступа("Просмотр", Документ) Тогда
ИмяДокумента = Документ.Синоним;
Если ИмяДокумента = "" Тогда
ИмяДокумента = Документ.Имя;
КонецЕсли;
Структура = Новый Структура;
Структура.Вставить("Тип", "Документ");
Структура.Вставить("Объект", Документ);
СписокВыбора.Добавить(Структура, ИмяДокумента, ,ЭлементыФормы.КартинкаДокумента.Картинка);
КонецЕсли;
КонецЦикла;
Код 1C v 7.x //Выведем список всех документов в окно сообщений
Для Индекс=1 По Метаданные.Документ() Цикл
Значение = Метаданные.Документ(Индекс).Идентификатор;
Представление = Метаданные.Документ(Индекс).Представление();
Комментарий = Метаданные.Документ(Индекс).Комментарий;
Сообщить(значение+" "+Представление+" "+Комментарий);
КонецЦикла;
// Выведем Список документов, ФормРегистр - Поле со списком на форме
ФормРегистр.УдалитьВсе();
Для ъ=1 По Метаданные.Регистр() Цикл
ФормРегистр.ДобавитьЗначение(Метаданные.Регистр(ъ).Идентификатор, Метаданные.Регистр(ъ).Представление());
КонецЦикла;
Если ФормРегистр.РазмерСписка()>0 Тогда
ФормРегистр.ТекущаяСтрока(1);
КонецЕсли;
//функция создаёт список реквизитов документа
Процедура гСписокРеквизитовДокумента(Список,Документ,ФлагПредставление=0) Экспорт
//шапка
Для i=1 По Метаданные.Документ(Документ).РеквизитШапки() Цикл
Ж=Метаданные.Документ(Документ).РеквизитШапки(i);
Если ФлагПредставление=0 Тогда
Представление=Ж.Идентификатор;
Иначе
Представление=Ж.Представление();
КонецЕсли;
Список.ДобавитьЗначение(Ж.Идентификатор,"Ш: "+Представление);
КонецЦикла;
//многострочка
Для i=1 По Метаданные.Документ(Документ).РеквизитТабличнойЧасти() Цикл
Ж=Метаданные.Документ(Документ).РеквизитТабличнойЧасти(i);
Если ФлагПредставление=0 Тогда
Представление=Ж.Идентификатор;
Иначе
Представление=Ж.Представление();
КонецЕсли;
Список.ДобавитьЗначение(Ж.Идентификатор,"Т: "+Представление);
КонецЦикла;
//общий
Для i=1 По Метаданные.ОбщийРеквизитДокумента() Цикл
Ж=Метаданные.ОбщийРеквизитДокумента(i);
Если ФлагПредставление=0 Тогда
Представление=Ж.Идентификатор;
Иначе
Представление=Ж.Представление();
КонецЕсли;
Список.ДобавитьЗначение(Ж.Идентификатор,"О: "+Представление);
КонецЦикла;
КонецПроцедуры
Категория:
Метаданные