Пример переноса данных из 1С 7.7 в 8.1 посредством XML файла Код 1C v 7.x xmldoc = CreateObject("Msxml2.DOMDocument");
xmlDoc.loadXML("<root/>");
nodeRoot = xmlDoc.documentElement;
расходы = xmlDoc.createElement("СправочникРасходы");
Спр = Создатьобъект("Справочник.Расходы");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 цикл
расход = xmlDoc.createElement("Расход");
расход.setAttribute("Код",Спр.Код);
расход.setAttribute("Наименование",Спр.Наименование);
расход.setAttribute("Родитель",Строка(Спр.Родитель));
расход.setAttribute("Цена",Строка(Спр.Цена.Получить(ТекущаяДата())));
расход.setAttribute("Количество",Строка(Спр.Количество));
расход.setAttribute("ЭтоГруппа",Строка(Спр.ЭтоГруппа()));
расходы.appendChild(расход);
КонецЦикла;
nodeRoot.appendChild(расходы);
ДвижениеСчетов = xmlDoc.createElement("ДвижениеСчетов");
рег = СоздатьОбъект("Регистр.Счет");
рег.ВыбратьДвижения();
Пока Рег.ПолучитьДвижение()=1 цикл
Движение = xmlDoc.createElement("Движение");
Движение.setAttribute("Приход",Строка(Рег.Приход));
Движение.setAttribute("Дата",Строка(Рег.ТекущийДокумент().ДатаДок));
Движение.setAttribute("Описатель",Строка(Рег.Описатель));
Движение.setAttribute("СтатьяРасходов",Строка(Рег.СтатьяРасходов));
Движение.setAttribute("СтатьяПоступлений",Строка(Рег.СтатьяПоступлений));
Движение.setAttribute("Кто",Строка(Рег.Кто));
Движение.setAttribute("Кому",Строка(Рег.Кому));
Движение.setAttribute("Остаток",Строка(Рег.Остаток));
Движение.setAttribute("Количество",Строка(Рег.Количество));
ДвижениеСчетов.appendChild(Движение);
КонецЦикла;
nodeRoot.appendChild(ДвижениеСчетов);
xmlDoc.save("C:\budjet.xml");
Код 1C v 8.х
Функция Кошель(Кош)
стр = ТП2.Найти(Кош,"Описатель");
Возврат Стр.Счет;
КонецФункции
Функция Вал(Кош)
стр = ТП2.Найти(Кош,"Описатель");
Возврат Стр.Валюта;
КонецФункции
Функция Дата1С(дат)
Возврат "20"+сред(дат,7,2)+сред(дат,4,2)+лев(дат,2);
КонецФункции
Процедура Загрузка(Элемент)
xmlDoc = Новый COMОбъект("MSXML2.DOMDocument");
xmlDoc.load("C:\budjet.xml");
nodeRoot = xmlDoc.documentElement;
Для каждого nod из nodeRoot.childNodes цикл
Если nod.nodeName = "СправочникРасходы" тогда
Сообщить("нашли СправочникРасходы");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код");
ТЗ.Колонки.Добавить("Наименование");
ТЗ.Колонки.Добавить("Родитель");
ТЗ.Колонки.Добавить("Цена");
ТЗ.Колонки.Добавить("Количество");
ТЗ.Колонки.Добавить("ЭтоГруппа");
Для Каждого Расход из nod.childNodes Цикл
Строка = ТЗ.Добавить();
Строка.Код = Расход.getAttribute("Код");
Строка.Наименование = Расход.getAttribute("Наименование");
Строка.Родитель = Расход.getAttribute("Родитель");
Строка.Цена = Число(Расход.getAttribute("Цена"));
Строка.Количество = Число(Расход.getAttribute("Количество"));
Строка.ЭтоГруппа = ?(Расход.getAttribute("ЭтоГруппа")="1",True,Ложь);
КонецЦикла;
//ТЗ.ВыбратьСтроку();
Для Каждого Стр из ТЗ Цикл
Родитель = Справочники.СтатьиЗатрат.НайтиПоНаименованию(Стр.Родитель,истина);
Справ = Справочники.СтатьиЗатрат.НайтиПоНаименованию(Стр.Наименование,истина);
Если Справ = Справочники.СтатьиЗатрат.ПустаяСсылка() тогда
Если Стр.ЭтоГруппа тогда
Справ = Справочники.СтатьиЗатрат.СоздатьГруппу();
Справ.Код = Стр.Код;
Справ.Наименование = Стр.Наименование;
Справ.Родитель = Родитель;
Справ.Записать();
Иначе
Справ = Справочники.СтатьиЗатрат.СоздатьЭлемент();
Справ.Код = Стр.Код;
Справ.Наименование = Стр.Наименование;
Справ.Родитель = Родитель;
Справ.Цена = Стр.Цена;
Справ.Количество = Стр.Количество;
Справ.Записать();
КонецЕсли;
Иначе
КонецЕсли;
КонецЦикла;
ИначеЕсли nod.nodeName = "ДвижениеСчетов" тогда
Сообщить("нашли движения счетов");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Приход");
ТЗ.Колонки.Добавить("Дата");
ТЗ.Колонки.Добавить("Описатель");
ТЗ.Колонки.Добавить("Статья");
ТЗ.Колонки.Добавить("Цена");
ТЗ.Колонки.Добавить("Количество");
Для каждого движ из nod.childNodes цикл
Строка = ТЗ.Добавить();
Строка.Приход = ?(движ.getAttribute("Приход")="1",True,Ложь);
Строка.Дата = Дата(Дата1С(движ.getAttribute("Дата")));
Строка.Описатель = движ.getAttribute("Описатель");
Строка.Статья = Справочники.СтатьиЗатрат.НайтиПоНаименованию(движ.getAttribute(?(Строка.Приход,"СтатьяПоступлений","СтатьяРасходов")),истина);
Строка.Цена = Число(движ.getAttribute("Остаток"));
Строка.Количество = Число(движ.getAttribute("Количество"));
КонецЦикла;
ТЗ.ВыбратьСтроку();
Доки = Новый ТаблицаЗначений;
Доки.Колонки.Добавить("Док");
Доки.Колонки.Добавить("Дата");
Доки.Колонки.Добавить("КошелекС");
Доки.Колонки.Добавить("КошелекНа");
Доки.Колонки.Добавить("Статья");
Доки.Колонки.Добавить("ВалютаС");
Доки.Колонки.Добавить("ВалютаНа");
Доки.Колонки.Добавить("ЦенаС");
Доки.Колонки.Добавить("ЦенаНа");
Доки.Колонки.Добавить("Количество");
УжеЕстьДок=Ложь;
док=0;
Для Каждого Стр Из ТЗ цикл
Если Стр.Приход Тогда
Если УжеЕстьДок тогда
Док.КошелекНа = Кошель(Стр.Описатель);
Док.ВалютаНа = Вал(Стр.Описатель);
Док.ЦенаНа = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
УжеЕстьДок=Ложь;
Иначе
Док = Доки.Добавить();
Док.КошелекНа = Кошель(Стр.Описатель);
Док.ВалютаНа = Вал(Стр.Описатель);
Док.ЦенаНа = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
Док.Док = "ПоступлениеСредств";
КонецЕсли;
Иначе
Док = Доки.Добавить();
Док.КошелекС = Кошель(Стр.Описатель);
Док.ВалютаС = Вал(Стр.Описатель);
Док.ЦенаС = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
Если СокрЛП(Стр.Статья.Наименование)="Обмен валюты" тогда
Док.Док = "ОбменВалюты";
УжеЕстьДок=истина;
ИначеЕсли СокрЛП(Стр.Статья.Наименование)="Перевод средств" тогда
Док.Док = "ПереводСредств";
УжеЕстьДок=истина;
Иначе
Док.Док = "РасходСредств";
УжеЕстьДок=Ложь;
КонецЕсли;
КонецЕсли;
Док.Дата = Стр.Дата;
КонецЦикла;
Доки.ВыбратьСтроку();
КонецЕсли;
КонецЦикла;
Для Каждого Док из Доки Цикл
Если Док.Док = "ПоступлениеСредств" тогда
Докум = Документы.ПоступлениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекНа;
Докум.Валюта = Док.ВалютаНа;
Докум.Сумма = Док.ЦенаНа;
Докум.Статья = Док.Статья;
Докум.Записать(РежимЗаписиДокумента.Проведение);
ИначеЕсли Док.Док = "ПереводСредств" тогда
Докум = Документы.ПеремещениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.КошелекКуда = Док.КошелекНа;
Докум.КошелекОтКуда = Док.КошелекС;
Докум.Валюта = Док.ВалютаНа;
Докум.Сумма = Док.ЦенаНа;
Докум.Записать(РежимЗаписиДокумента.Проведение);
ИначеЕсли Док.Док = "ОбменВалюты" тогда
Докум = Документы.ПеремещениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.КошелекКуда = Док.КошелекНа;
Докум.КошелекОтКуда = Док.КошелекС;
Докум.Валюта = Док.ВалютаС;
Докум.Сумма = Док.ЦенаС;
Докум.Записать(РежимЗаписиДокумента.Проведение);
Докум = Документы.ОбменВалюты.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекНа;
Докум.ВалютаС = Док.ВалютаС;
Докум.ВалютаНа = Док.ВалютаНа;
Докум.СуммаС = Док.ЦенаС;
Докум.СуммаНа = Док.ЦенаНа;
Докум.Курс = Докум.СуммаС / Докум.СуммаНа;
Докум.Переключатель = 1;
Докум.Записать(РежимЗаписиДокумента.Проведение);
Иначе
Докум = Документы.РасходСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекС;
Докум.Валюта = Док.ВалютаС;
тч = Докум.Затраты.Добавить();
тч.Сумма = Док.ЦенаС;
тч.Статья = Док.Статья;
тч.Цена = Док.ЦенаС;
тч.Количество = Док.Количество;
Докум.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьТЗДанными(Элемент)
xmlDoc = Новый COMОбъект("MSXML2.DOMDocument");
xmlDoc.load("C:\budjet.xml");
nodeRoot = xmlDoc.documentElement;
Для каждого nod из nodeRoot.childNodes цикл
Если nod.nodeName = "ДвижениеСчетов" тогда
Сообщить("нашли движения счетов");
ТП1 = Новый ТаблицаЗначений;
ТП1.Колонки.Добавить("Описатель");
Типы = Новый Массив(1); Типы[0] = Тип("СправочникСсылка.Кошельки");
Тип = Новый ОписаниеТипов(Типы);
ТП1.Колонки.Добавить("Счет",Тип);
Типы[0] = Тип("СправочникСсылка.Валюты");
Тип = Новый ОписаниеТипов(Типы);
ТП1.Колонки.Добавить("Валюта",Тип);
Для каждого движ из nod.childNodes цикл
Описатель = движ.getAttribute("Описатель");
если ТП1.Найти(Описатель,"Описатель") = Неопределено тогда
стр = ТП1.Добавить();
Стр.Описатель = Описатель;
КонецЕсли;
КонецЦикла;
ТП2=ТП1;//ВыбратьСтроку();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Категория:
XML, DBF, TXT, CSV Выбрать все движения регистра по датам в заданном интервале дат Выбрать все движения регистра по датам в заданном интервале дат
Код 1C v 7.x рег=создатьобъект("Регистр.Обороты");
рег.ВыбратьДвижения(НачМесяца(ТекущаяДата()));
Пока рег.ПолучитьДвижение()=1 Цикл
Сообщить("Товар="+строка(рег.Товар)+
" склад="+строка(рег.Склад)+
" контрагент="+строка(рег.Контрагент)+
" кол-во="+рег.Количество +
" сумма="+рег.Сумма);
КонецЦикла;
Категория:
Регистры Выбрать все движения регистра с остатками Метод ВыбратьДвиженияСОстатками инициирует выбор всех движении регистра в указанном интервале дат. Если <КонецВыборки> не указан или равен 0, то конном временного интервала выбора движений регистра считается ТА.
Данный метод отличается от метода ВыбратьДвижения тем, что после получения очередного движения метод Остаток будет выдавать актуальные значения остатков для этого регистра.
Код 1C v 7.x
Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
Рег.УстановитьФильтр(Клиент, );
РассчитатьРегистрыНа(ДатаНачала);
Рег.ВыбратьДвиженияСОстатками(ДатаКонца);
Пока Рег.ПолучитьДвижение() = 1 Цикл
Прих = 0;
Расх = 0;
Если Рег.Приход = 1 Тогда
Прих = Рег.Долг;
Иначе
Расх = Рег.Долг;
КонецЕсли;
ТекущееСальдо = Рег.Остаток(Клиент, "Задолженность");
Док = Рег.ТекущийДокумент();
Таб.ВывестиСекцию("Документ");
КонецЦикла;
Категория:
Регистры Выбрать все движения регистра по датам Код 1C v 7.x
Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
Если Режим = "Подробно" Тогда
Рег1.УстановитьФильтр(Клиент);
Рег1.ВыбратьДвижения(ДатаНачало, );
Пока Рег1.ПолучитьДвижение() > 0 Цикл
Док = Рег1.ТекущийДокумент();
Дв_Баз_Сум = Рег1.СуммаБазовая;
Дв_Вал_Сум = Рег1.СуммаВалютная;
Если Рег1.Расход = 1 Тогда
Таб.ВывестиСекцию("Расход2");
Иначе
Таб.ВывестиСекцию("Приход2");
КонецЕсли;
КонецЦикла;
КонецЕсли;
Категория:
Регистры Выбрать все движения регистра по документу Код 1C v 7.x
Процедура Взаиморасчеты(ВыбКлиент, ДатаНачало, ДатаКонец)
// Создание Таблицы для выходного отчета
Заг = "Неизвестно.";
Таб = СоздатьОбъект("Таблица");
Клн = СоздатьОбъект("Справочник.Клиенты");
Клн.ИспользоватьДату(ДатаКонец);
Док = СоздатьОбъект("Документ");
Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
РассчитатьРегистрыНа(ДатаКонец);
Если ВыбКлиент.Выбран() = 0 Тогда
//Без условий
Заг = "По всем клиентам.";
ИначеЕсли ВыбКлиент.ЭтоГруппа() = 1 Тогда
Клн.ВключатьПодчиненные(ВыбКлиент);
Клн.ИспользоватьРодителя(ВыбКлиент);
Заг = "По клиентам группы " + ВыбКлиент.Наименование;
Иначе
Предупреждение("Выберите группу клиентов!");
Возврат;
КонецЕсли;
Таб.ВывестиСекцию("Отчет");
Клн.ВыбратьЭлементы();
Пока Клн.ПолучитьЭлемент() > 0 Цикл
Если Клн.ЭтоГруппа() = 1 Тогда
Таб.ВывестиСекцию("Группа");
Иначе
Рег.Клиент = Клн.ТекущийЭлемент();
Рег.ОстаткиПолучить();
Баз_сум = Рег.СуммаБазовая;
Вал_сум = Рег.СуммаВалютная;
Таб.ВывестиСекцию("Клиент");
// цикл по всем документам
Док.ВыбратьДокументы(ДатаНачало, ДатаКонец);
Пока Док.ПолучитьДокумент() > 0 Цикл
// отфильтруем документы
Если (Док.Вид() = "Перемещение") ИЛИ (Док.Вид() = "Счет") ИЛИ
(Док.Вид() = "Списание") ИЛИ
(Док.Вид() = "РучноеИзмОстатка") Тогда
// Эти Документы не изменяют Взаиморасчеты
Продолжить;
КонецЕсли;
// выберем все движения регистра по документу
Рег1.ВыбратьДвиженияДокумента(Док.ТекущийДокумент());
Пока Рег1.ПолучитьДвижение() > 0 Цикл
Если Строка(Рег1.Клиент.Код) <> Строка(Клн.Код) Тогда
// не тот клиент
Продолжить;
КонецЕсли;
Дв_Баз_Сум = Рег1.СуммаБазовая;
Дв_Вал_Сум = Рег1.СуммаВалютная;
Если Рег1.Приход = 1 Тогда
Таб.ВывестиСекцию("Приход");
Иначе
Таб.ВывестиСекцию("Расход");
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
//Вызов выходного отчета в окно просмотра и редактирования.
Таб.ТолькоПросмотр(1);
Таб.Опции(0, 0, 4, 0);
Таб.Показать("Взаиморасчеты с клиентами", "");
ВыбКлиент = 0;
КонецПроцедуры
Категория:
Регистры Установить фильтр для оптимизации действий с регистром Код 1C v 7.x // Пример 1
// Для регистра с измерениями «Товар», «Склад», «МОЛ» запись
Рег.УстановитьФильтр(Тов1, , );
// означает, что расчеты будут проводиться только по одному товару (Тов1), но по всем складам и МОЛам.
Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
Рег.УстановитьФильтр(Клиент, );
РассчитатьРегистрыНа(ДатаНачала);
Рег.ВыбратьДвиженияСОстатками(ДатаКонца);
Пока Рег.ПолучитьДвижение() = 1 Цикл
Прих = 0;
Расх = 0;
Если Рег.Приход = 1 Тогда
Прих = Рег.Долг;
Иначе
Расх = Рег.Долг;
КонецЕсли;
ТекущееСальдо = Рег.Остаток(Клиент, "Задолженность");
Док = Рег.ТекущийДокумент();
Таб.ВывестиСекцию("Документ");
КонецЦикла;
// Пример 2
РегТовары = СоздатьОбъект("Регистр.Товары");
//выбрать все движения по данному складу за период
РегТовары.УстановитьФильтр(,ТекСклад);
РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон);
Пока РегТовары.ПолучитьДвижение()=1 Цикл
//... код
КонецЦикла;
// Пример 3
РегТовары = СоздатьОбъект("Регистр.Товары");
//выбрать все товары на данном складе
РегТовары.УстановитьФильтр(,ТекСклад);
РегТовары.ВыбратьИтоги();
Пока РегТовары.ПолучитьИтог()=1 Цикл
//... код
КонецЦикла;
Категория:
Регистры Получить движения регистра Код 1C v 7.x // Пример 1
Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
Если Режим = "Подробно" Тогда
Рег1.УстановитьФильтр(Клиент);
// Открываем выборку
Рег1.ВыбратьДвижения(ДатаНачало, );
// Цикл выбора движений по регистру
Пока Рег1.ПолучитьДвижение() > 0 Цикл
Если Строка(Рег1.Клиент.Код) <> Строка(Запрос.Клиент.Код) Тогда
Продолжить;
КонецЕсли;
Док = Рег1.ТекущийДокумент();
Дв_Баз_Сум = Рег1.СуммаБазовая;
Дв_Вал_Сум = Рег1.СуммаВалютная;
Если Рег1.Расход = 1 Тогда
Таб.ВывестиСекцию("Расход2");
Иначе
Таб.ВывестиСекцию("Приход2");
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Пример 2
РегТовары = СоздатьОбъект("Регистр.Товары");
РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон);
Пока РегТовары.ПолучитьДвижение()=1 Цикл
Сообщить("Дата движения " + Строка(РегТовары.ТекущийДокумент.ДатаДок));
Сообщить("Клиент: " + РегТовары.Клиент);
Сообщить("Товар: " + РегТовары.Товар);
Сообщить("Сумма: " + РегТовары.Доход);
КонецЦикла;
Категория:
Регистры Выбрать все движения регистра с остатками Метод ВыбратьДвиженияСОстатками инициирует выбор всех движении регистра в указанном интервале дат. До вызова данной процедуры может быть установлен фильтр (см. УстановитьФильтр), ограничивающий выборку значений из регистра. Если <КонецВыборки> не указан или равен 0, то конном временного интервала выбора движений регистра считается ТА.
Данный метод отличается от метода ВыбратьДвижения тем, что после получения очередного движения метод Остаток будет выдавать актуальные значения остатков для этого регистра. Но для этого перед вызовом метода ВыбратьДвиженияСОстатками регистру должен быть установлен признак временногоРасчета» (см. ВременныйРасчет) и должен быть выполнен временный расчет (см. РассчитатьРегистрыНа и РассчитатьРегистрыПо) — его дата и будет являться начальной датой выбираемых движений регистра.
Данная возможность не может быть использована совместно с дальнейшими «Временными» расчетами.
Собственно выбор первого и последующих движений регистра осуществляется методом ПолучитьДвижение.
Код 1C v 7.x
Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
Рег.УстановитьФильтр(Клиент, );
РассчитатьРегистрыНа(ДатаНачала);
Рег.ВыбратьДвиженияСОстатками(ДатаКонца);
Пока Рег.ПолучитьДвижение() = 1 Цикл
Прих = 0;
Расх = 0;
Если Рег.Приход = 1 Тогда
Прих = Рег.Долг;
Иначе
Расх = Рег.Долг;
КонецЕсли;
ТекущееСальдо = Рег.Остаток(Клиент, "Задолженность");
Док = Рег.ТекущийДокумент();
КонецЦикла;
Категория:
Регистры