- Установить flesh память в USB разъём
- Открыть из 1С обработку из корневой папки съемного диска «»
- После этого на экране появится окно обработки, показанное на рисунке 21.

Рисунок 21 – окно подпрограммы «загрузка документов»
- Выберите каталог с файлами перегружаемых данных (имя каталога должно совпадать с номером накладной).
- Выберите склад и тип цен
- Нажмите кнопку «Загрузить»
- Дождитесь обработки выгрузки и распечатайте все полученные по окончании ценники.
5.2 Эксплуатация WEB портала
Настройку и доработку приложения должен производить лишь опытный разработчик с квалификацией по используемым технологиям.
На начальном этапе допускается непосредственное изменение записей таблиц посредством программы SQL Server.
Требования к компьютеру WEB пользователя таковы:
- Internet Explorer 6 x
- Разрешение экрана выше, либо равное 1024x768
- Разрешение всплывающих окон (для Windows XP SP2)
- Разрешение использования Java Script
Работа основана на интуитивно понятных принципах, уже устоявшихся в современном сайтостроении.
ЗАКЛЮЧЕНИЕ
Полученная АИС «Работа с покупателями» представляет собой законченный продукт, полностью отвечающий предъявленным требованиям.
В комплекс входят программные средства:
- для поддержания актуального состояния распределённой базы данных
- автоматизирующие работу кассира
- копирования данных с сервера 1С и с удалённых точек на WEB сервер (SQL Server 2000).
- Законченный Интернет портал, отвечающий поставленным требованиям
Созданная распределённая база данных успешно функционирует на предприятии более месяца. Интернет портал будет введён в коммерческую эксплуатацию с середины июля 2005 года.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Прилагаемая к системе «1С предприятие» документация и встроенная справка (синтаксис – помощник).
2. «1С:Торговля и Склад в вопросах и ответах: Практическое пособие». М.: 1С-Паблишинг», 2003 г. -273 с.
3. «Конфигурирование и администрирование 1С: Предприятия». , Шумейко н/Д: Феникс, 2003 г – 320 с.
4. «1С:Предпирятие: программирование для всех». – М.: Диалог-МИФИ, 2004. – 464 с.
5. «1С:Предприятие. Эффективное программирование». – М.:Новое знание, 2004 г. – 464с.
6. Форум «Территория “1С”»: http://www. *****/cgi-bin/forum/forum9.cgi
7. Клуб профессионалов 1С: http://1c. *****/
8. «Windows Server 2003. Для профессионалов». . – СПб.: Питер, 2004. – 767 с.
9. «Как программировать для Internet и WWW». , Дж., . Пер. с англ. – М.: БИНОМ», 2002 г. – 1184 с.
10. «JavaScript 1.5: Учебный курс». Кингсли- Кингсли-: Питер, 2002 г. – 272 с.
11. «JavaScript и DHTML. Сборник рецептов. Для профессионалов». – СПб.: Питер, 2004 г. – 523 с.
12. «Основы с примерами на C#». Пер. с англ. – М.: Издательский дом «Вильямс», 2003 г. – 304 с.
13. Mania – все про и .NET Framework: http:///
14. «Использование C#. Специальное издание». Специалисты NIIT. Пер. с англ – М.: Издательский дом «Вильямс», 2002 г. – 528 с.
15. «Самоучитель Visual 2003». - СПб.: БХВ - Петербург, 200с.
16. «C# и платформа. NET. Библиотека программиста». Троелсен. Э. – СПб.: Питер, 2005. – 796 с.
17. «Программирование web-сервисов для. NET. Библиотека программиста». Мак- – Киев: BHV; СПб.: Питер, 2003. – 430 с.
18. MSDN Library for Visual Studio 2005 Beta
19. http://*****/
20. http://www. *****/
21. «Microsoft SQL Server 7 для профессионалов». – СПб: Издательство «Питер», 2000 г. – 896 с.
22. «Visual : разработка приложений баз данных». – СПб.: БХВ-Петербург, 2003 г. – 544 с.
23. « Сборник рецептов. Для профессионалов.». - СПб.: Питер, 2005 – 576 с.
24. http://*****/
ПРИЛОЖЕНИЕ А
Концептуальная модель переноса данных.

ПРИЛОЖЕНИЕ Б
Код Web службы (Файл «Service. asmx»)
// Данная служба - возвращает остаток по посланному коду
using System. Web;
using System;
using System. Reflection;
using System. Web. Services;
using System. Web. Services. Protocols;
using System. Data;
using System. Data. OleDb;
[WebServiceBinding(ConformanceClaims=WsiClaims. BP10,EmitConformanceClaims = true)]
public class Service : System. Web. Services. WebService {
private
// Параметры для подключения к 1С
Type _1C = null; // ассоциация с программой
object tor = null; // COM объект
object rmtrade = null;
object[] args = null; // аргументы для функции
object Order = null;
//***
// Подключение к 1С. Возвращает true в случае удачи и false - неудачи
bool podkluchenie(){
_1C = Type. GetTypeFromProgID("V77s. Application");
try{
tor = Activator. CreateInstance(_1C);
rmtrade = _1C. InvokeMember("RMTrade", BindingFlags. GetProperty, null, tor, null);
// Задаём парметры подключения, чтобы вход происходил автоматически
args = new object[] { rmtrade, "/DC:\\ttt\\ /NFOKS /P676676 ", "NO_SPLASH_SHOW" };
//Запуск 1С
_1C. InvokeMember("Initialize", BindingFlags. InvokeMethod, null, tor, args);
return true;
}
catch{
// Нет доступа к COM объекту
//return "Ошибка - проверь безопастность OLE";
//Скорее всего в Windows заданы права доступа к COM объектам только локальным
//пользователям. Лечится через "Служба компонентов"
return false;
}
}
//******
// Выполняет процедуру с заданным именем и с заданными параметрами
// Через неё обращаться к функциям, которые возвращают одну переменную
object Procedura1C_par(string Imja, string Param){
args = new object[] { Param };
return _1C. InvokeMember(Imja, BindingFlags. InvokeMethod, null, tor, args);
}
//******
// Выполняет процедуру с заданным именем и с заданными параметрами
// Через неё обращаться к функциям, которые возвращают ТЗ
object Procedura1C_tz(string Imja, string Param){
args = new object[] {};
//*return_1C. InvokeMember(Imja, BindingFlags. GetField | BindingFlags. InvokeMethod | BindingFlags. Default, null, tor, null);
return _1C. InvokeMember(Imja, BindingFlags. InvokeMethod | BindingFlags. OptionalParamBinding, null, tor, args);
}
//******
// Обращается к процедуре 1С и возвращает таблицу с результатами
// Через неё обращение к процедурам 1С, которые пишут файлы dbf
// Параметры:
// ImjaProc - имя вызываемой процедуры
// ImjaKat - каталог, из которого будут загружены таблицы
// ImjaTabl - имя таблицы
DataTable Vigr(string ImjaProc, string ImjaKat, string ImjaTabl)
{
// object ost;
int i;
string rez;
DataSet dt = new DataSet();
DataTable ddt = new DataTable();
if (podkluchenie())
{// Если удалось подключиться
try
{
rez = Procedura1C_tz(ImjaProc, "").ToString();
// Теперь у нас всё как надо - выгрузилась БД в файл.
// Подключаемся к ней через
string konekt = @"Provider=Microsoft. Jet. OLEDB.4.0;Data Source="+ImjaKat+";Extended Properties=dBase IV;mode=Read|Write|Share Deny None";
string zapr = "Select * from " + ImjaTabl;
OleDbDataAdapter adapt = new OleDbDataAdapter(zapr, konekt);
adapt. Fill(dt, ImjaTabl);
//ds. WriteXml(@"C:\ttt. xml");
_1C. InvokeMember("ExitSystem", BindingFlags. InvokeMethod, null, tor, new object[] { 0 });
tor = null;
_1C = null;
return dt. Tables[0];
}
catch
{// Если возникла ошибка
_1C. InvokeMember("ExitSystem", BindingFlags. InvokeMethod, null, tor, new object[] { 0 });
tor = null;
_1C = null;
return ddt;
}
}
else
{ // Если не удалось подключиться
_1C. InvokeMember("ExitSystem", BindingFlags. InvokeMethod, null, tor, new object[] { 0 });
tor = null;
_1C = null;
return ddt;
}
}
[WebMethod]
public
//******
// Возвращает Количество оставшегося товара по его коду
string OstatokPoKodu(string nom) {
string ost;
ost = "Пусто";
if (podkluchenie()){
ost = Procedura1C_par("GlVozrOst", nom).ToString();
_1C = null;
return ost;
}else{
_1C = null;
return null;
}
}
[WebMethod]
public
//******
// Сохраняет номенклатуру
DataTable VigruzNom(){
return Vigr("GlVozrNom", @"C:\BD_WB\nomen\", "nomen");
}
[WebMethod]
public
//******
// Сохраняет и передаёт цены
DataTable VigruzCeni()
{
return Vigr("GlVozrCeni", @"C:\BD_WB\ceni\", "ceni");
}
[WebMethod]
public
//******
// Сохраняет и передаёт остатки
DataTable VigruzOst()
{
return Vigr("GlVozrOstatki", @"C:\BD_WB\ost_osnov\", "ost");
}
}
ПРИЛОЖЕНИЕ В
Функции глобального модуля,
формирующие данные для WEB Службы.
Функция глВернутьЦену(Номенклатура, ТипЦены, ДатаЦены = 0, ЦенаЦены = 0, ЕдЦены = 0, ВалЦены = 0, НаценкаЦены = 0, НайденнаяЦена = 0, НеДобавИздержки=0) Экспорт Далее
Функция GlVozrOst(кд_ном) Экспорт Далее
Функция GlVozrCeni() Экспорт Далее
Функция GlVozrNom() Экспорт Далее
//###############################################################################
// Блок для работы с интернет магазином через Web службу
//***
// Функция возвращает параметр по имени из файла nastr. txt рабочего каталога
// Формат файла:
// строки начинающиеся с # - коментарии
// имя параметра задаётся как [имя], а значение лежит на строчку внизу
Функция ПарамПоИмени(пар)
Перем номСтрок;
Перем стр;
Ткст = СоздатьОбъект("Текст");
Ткст. КодоваяСтраница(0);
Ткст. Открыть(КаталогИБ()+"nastr. txt");
номСтрок = 1;
Пока номСтрок <= Ткст. КоличествоСтрок() Цикл
стр = Ткст. ПолучитьСтроку(номСтрок);
// удаляем пробелы в начале и конце строки
СокрЛП(стр);
Если стрДлина(стр)>0 Тогда
// Если коментарий, то пропускаем
Если Лев(стр, 1) = "#" Тогда
номСтрок = номСтрок + 1;
Продолжить;
КонецЕсли;
// Если какой то параметр, тогда
Если Лев(стр, 1) = "[" Тогда
стр = лев(стр, стрДлина(стр)-1);
стр = прав(стр, стрДлина(стр)-1);
// Если этот параметр - искомый
Если стр = пар Тогда
Возврат СокрЛП(Ткст. ПолучитьСтроку(номСтрок+1));
КонецЕсли;
КонецЕсли;
КонецЕсли;
номСтрок = номСтрок + 1;
КонецЦикла;
Возврат "0"; // Если ничего не нашли - возвращает ноль
КонецФункции
//**
// Функция возвращает количество товара по его коду, преднозначена для вывода через Web службу
Функция GlVozrOst(кд_ном) Экспорт
Перем Ост;
Ном=создатьОбъект("Справочник. Номенклатура");
Склд = СоздатьОбъект("Справочник. Склады");
Регр = СоздатьОбъект("Регистр. ОстаткиТМЦ");
Склд. НайтиПоКоду("00001");
Ном. НайтиПоКоду(кд_ном);
Ост = 0;
Ост = Регр. СводныйОстаток( ,ном. ТекущийЭлемент(), Склд. ТекущийЭлемент(),,"Количество");
Возврат Ост;
КонецФункции
//***
// Функция возвращает таблицу значений - номенклатуру с кодом и её параметры
Функция GlVozrNom() Экспорт
Перем Ост, ТабЗн;
Перем КатВыгр;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Номенклатура)
|Ном = Справочник. Номенклатура. ТекущийЭлемент;
|Группировка Ном;"//}}ЗАПРОС
;
Если Запрос. Выполнить(ТекстЗапроса) = 0 Тогда
Предупреждение("Ошибка в запросе");
КонецЕсли;
КатВыгр = ПарамПоИмени("КаталогВыгр") + ПарамПоИмени("Ном");
ДБФ = СоздатьОбъект("XBase");
ДБФ. ДобавитьПоле("EtoGruppa",1,1,0);
ДБФ. ДобавитьПоле("KodNom",2,9,0);
ДБФ. ДобавитьПоле("Otec",2,9,0);
ДБФ. ДобавитьПоле("Strana",2,20,0);
ДБФ. ДобавитьПоле("Naimenov",2,250,0);
ДБФ. СоздатьФайл(КатВыгр+"nomen. dbf");
ДБФ. КодоваяСтраница(1);
Запрос. ВНачалоВыборки();
Пока Запрос. Группировка(1)=1 Цикл
ДБФ. Добавить();
ДБФ. KodNom = Запрос. Ном. Код;
ДБФ. Otec = Запрос. Ном. Родитель. Код;
ДБФ. Strana=Запрос. Ном. СтранаПроисхождения. Наименование;;
ДБФ. Naimenov=Запрос. Ном. Наименование;
ДБФ. EtoGruppa=Запрос. ЭтоГруппа(1);
ДБФ. Записать();
КонецЦикла;
Возврат 1;
КонецФункции
//***
// Возвращает цену по указанным парметрам - используется в запросе внизу
Функция ВозрНомерПрайса(Кд) Экспорт
Если Кд = "00002" Тогда
Возврат 1;
ИначеЕсли Кд = "00003" Тогда
Возврат 2;
ИначеЕсли Кд = "00004" Тогда
Возврат 3;
ИначеЕсли Кд = "00005" Тогда
Возврат 4;
ИначеЕсли Кд = "00006" Тогда
Возврат 5;
ИначеЕсли Кд = "00007" Тогда
Возврат 6;
ИначеЕсли Кд = "00001" Тогда
Возврат 0;
Иначе
Возврат 33; // Если ошибка. 0 нельзя, т. к. вдруг это у нас более низкие
КонецЕсли;
КонецФункции
//***
// Функция возвращает цены на номенклатуру и номер прайса
Функция GlVozrCeni() Экспорт
Перем Ост, ТабЗн;
Перем КатВыгр;
Перем изПроц;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Цены)
|Номенклатура = Справочник. Цены. Владелец;
|ТипКод = Справочник. Цены. ТипЦен. Код;
|Тип = Справочник. Цены. ТипЦен;
|Цен = Справочник. Цены. ТекущийЭлемент;
|Группировка Цен;
|"//}}ЗАПРОС
;
Если Запрос. Выполнить(ТекстЗапроса) = 0 Тогда
Предупреждение("Ошибка в запросе");
КонецЕсли;
КатВыгр = ПарамПоИмени("КаталогВыгр") + ПарамПоИмени("Цен");
ДБФ = СоздатьОбъект("XBase");
ДБФ. ДобавитьПоле("Cena",1,8,2);
ДБФ. ДобавитьПоле("Nomen",2,9,0);
ДБФ. ДобавитьПоле("Prajs",1,2,0);
ДБФ. СоздатьФайл(КатВыгр+"Ceni. dbf");
ДБФ. КодоваяСтраница(1);
Запрос. ВНачалоВыборки();
Пока Запрос. Группировка(1)=1 Цикл
Если (Запрос. ТипКод<>"00010") Тогда
ДБФ. Добавить();
глВернутьЦену(Запрос. Номенклатура, Запрос. Тип,,изПроц,,,,0);
ДБФ. Cena = изПроц;
ДБФ. Nomen = Запрос. Номенклатура. Код;
ДБФ. Prajs = ВозрНомерПрайса(Запрос. ТипКод);
ДБФ. Записать();
КонецЕсли;
КонецЦикла;
Возврат 1;
КонецФункции
//***
// Функция возвращает остатки номенклатуры
Функция GlVozrOstatki() Экспорт
Перем катВыгр, дат;
Перем ск;
ОСТ = СоздатьОбъект("XBase");
ОСТ. ДобавитьПоле("Kod",2,9,0);
ОСТ. ДобавитьПоле("Ostatok",1,5,0);
катВыгр =ПарамПоИмени("КаталогВыгр") + ПарамПоИмени("Ост");
ОСТ. СоздатьФайл(катВыгр+"ost. dbf");
ОСТ. КодоваяСтраница(1);
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Выгр_Ост)
|РегНом = Регистр. ОстаткиТМЦ. Номенклатура;
|РегСклд = Регистр. ОстаткиТМЦ. Склад. Код;
|РегКол = Регистр. ОстаткиТМЦ. Количество;
|Группировка РегНом без Групп;
|Группировка РегСклд;
|Функция КОН = КонОст(РегКол);"//}}ЗАПРОС
;
Если Запрос. Выполнить(ТекстЗапроса) = 0 Тогда
Предупреждение("Ошибка в запросе");
КонецЕсли;
Запрос. ВНачалоВыборки();
Пока Запрос. Группировка(1)=1 Цикл
Пока Запрос. Группировка(2)=1 Цикл
Если Запрос. РегСклд="00001" Тогда
ОСТ. Добавить();
ОСТ. Kod = Запрос. РегНом. Код;
ОСТ. Ostatok = Запрос. КОН;
ОСТ. Записать();
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат 1;
КонецФункции
ПРИЛОЖЕНИЕ Г
Некоторые хранимые процедуры и запросы
к системе «SQL Server»
Хранимая процедура «DobTov»
/*добавляет товар к указанному заказу в указанном количестве,
а сумму исчет сам и вставляет - по коду передаваемого прайса */
CREATE PROCEDURE DobTov
@Nomen char(9) ,
@Zakaz int,
@Kolichestvo int,
@Prajs smallint
AS
DECLARE @cen money
SET @cen=(SELECT SUM(Cena) FROM _Ceni WHERE ((NomerPrajsa = @Prajs) and (_Ceni. Nomen=@Nomen)))
INSERT _TovariVZakaze (Nomen, Zakaz, Kolichestvo, Cena, Sym)
VALUES (@Nomen, @Zakaz, @Kolichestvo, @cen, @cen*@Kolichestvo)
GO
Хранимая процедура «NomenObnovi»
/* Служит для загрузки Номенклатуры с сервера 1С.
Если позиция с таким кодом, то обновляет. Иначе - добавляет
*/
CREATE PROCEDURE NomenObnovi
@KodNom char(9),
@EtoGruppa smallint,
@Otec char(9),
@Strana char(30),
@Naimenov char(300)
AS
IF (SELECT COUNT(KodNom) FROM _Nomenklatura WHERE (KodNom = @KodNom))>0 BEGIN
UPDATE [_Nomenklatura] SET [EtoGruppa] = @EtoGruppa, [Otec] = @Otec, [Strana] = @Strana, [Naimenov] = @Naimenov WHERE ([KodNom] = @KodNom)
END
ELSE BEGIN
INSERT INTO [_Nomenklatura] ([KodNom], [EtoGruppa], [Otec], [Strana], [Naimenov]) VALUES (@KodNom, @EtoGruppa, @Otec, @Strana, @Naimenov)
END
GO
Запрос из VisualStudio (страница «default. aspx» при переходе с «prajs. aspx») к 1С, сохраняющий данные по условию в Excel:
// Копируем файл из вложенного каталога /shabloni в /zaka4
// При копировании - добавляем к имени файла rendom'om число
Random rnd = new Random(); // Для получения случайного значения
// тут мы получаем случайное значение, чтобы потом добавить к имени файла
String str_rnd = Convert. ToInt32(rnd. NextDouble() * 10000).ToString();
// Задаём пути к файлам
string path = Server. MapPath("") +@"\Shabloni\Price. xls";
string path2 = Server. MapPath("") + @"\Zaka4\Price" + str_rnd + ".xls";
// Копируем файл шаблонный
FileInfo fi1 = new FileInfo(path);
fi1.CopyTo(path2);
String zapr3;
zapr3 = "insert into OPENROWSET('Microsoft. Jet. OLEDB.4.0', 'Excel 8.0; Database=" + path2 + " ; ID=Foks; Password=676676', 'SELECT * FROM [Прайс$]') SELECT Naimenov, KodNom, Strana, MinimPartija, CAST (Cena AS nvarchar) FROM dbo._Nomenklatura, dbo._Ceni, dbo._Ostatki WHERE (([EtoGruppa] = 0) AND (Kolichestvo>0) AND (_Ostatki. Nomen=KodNom) AND (_Ceni. Nomen=KodNom) AND (NomerPrajsa=" +
Session["prs"].ToString() + ") AND (Otec='"+ str +"') ) ORDER BY Naimenov";
// помечаем всё цыфркой 3, дабы 100% не было конфликтов
SqlConnection con3 = new SqlConnection(System. Configuration. ConfigurationSettings. ConnectionStrings["ConnectionForForWeb"].ConnectionString);
SqlCommand cmd3 = new SqlCommand(zapr3, con3);
con3.Open();
cmd3.ExecuteScalar();
con3.Close();
ПРИЛОЖЕНИЕ Д
Код работы с WEB Службой из
//******
//Загрузка номенклатуры, которую получаем от удалённой службы
void Button1_Click(object sender, EventArgs e)
{
int i, vsego; // Счётчик и общее число записей, полученных от Web Службы
DataTable ds = new DataTable();
Sluzba. Service ws = new Sluzba. Service();
ws. Timeout = 1000 * 60 * 5;
try{
ds = ws. VigruzNom(); // Получаем данные с удалённой службы
}
catch{
LabelInfo. Text = "Ошибка доступа к 1С. Подождите 15 минут и повторите попытку";
return;
}
// ds. Tables[0].TableName = "Nomenkl";
// ds. Tables[0].Columns[0].ColumnName = "EtoGruppa";
// ds. Tables[0].Columns[1].ColumnName = "KodNom";
// ds. Tables[0].Columns[2].ColumnName = "Otec";
// ds. Tables[0].Columns[3].ColumnName = "Strana";
// ds. Tables[0].Columns[4].ColumnName = "Naimenov";
// ds. WriteXml(@"C:\ds. xml");
// Подключение к MS SQL Server
SqlConnection konekt = new SqlConnection("Server=FKS;Integrated Security=True;Database=ForWeb");
SqlCommand sqlcom = new SqlCommand("NomenObnovi", konekt);
mandType = CommandType. StoredProcedure;
SqlParameter param = null;
param = sqlcom. Parameters. Add(new SqlParameter("@KodNom", SqlDbType. Char, 9));
param. Direction = ParameterDirection. Input;
param = sqlcom. Parameters. Add(new SqlParameter("@EtoGruppa", SqlDbType. SmallInt, 9));
param. Direction = ParameterDirection. Input;
param = sqlcom. Parameters. Add(new SqlParameter("@Otec", SqlDbType. Char, 9));
param. Direction = ParameterDirection. Input;
param = sqlcom. Parameters. Add(new SqlParameter("@Strana", SqlDbType. Char, 30));
param. Direction = ParameterDirection. Input;
param = sqlcom. Parameters. Add(new SqlParameter("@Naimenov", SqlDbType. Char, 300));
param. Direction = ParameterDirection. Input;
LabelInfo. Text = "Ждите завершения выгрузки номенклатуры";
vsego = ds. Rows. Count;
konekt. Open();
for (i = 0; i < vsego; i++)
{
sqlcom. Parameters[0].Value = ds. Rows[i][1];
sqlcom. Parameters[1].Value = ds. Rows[i][0];
sqlcom. Parameters[2].Value = ds. Rows[i][2];
sqlcom. Parameters[3].Value = ds. Rows[i][3];
sqlcom. Parameters[4].Value = ds. Rows[i][4];
sqlcom. ExecuteNonQuery();
}
konekt. Close();
LabelInfo. Text = "Выгрузка номенклатуры успешно завершена, обновилось записей - " + vsego;
}
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


